HSF302Chưa đoKỳ 5Tự chọn Cập nhật 22 giờ trước

HSF302 - Làm việc với Spring Framework

HSF302 - Làm việc với Spring Framework là môn 3 tín chỉ bậc cử nhân của Đại học FPT, học sau PRJ301. Vấn đề môn giải quyết là dựng một ứng dụng Java nhiều tầng mà không phải tự tay khởi tạo từng lớp rồi nối chúng với nhau. Điểm xuất phát là một yêu cầu HTTP: DispatcherServlet nhận nó, tìm phương thức controller khớp đường dẫn, gắn tham số vào đối số rồi trả về một trang hoặc một đối tượng JSON. Đằng sau controller là các đối tượng do IoC container tạo ra và tiêm vào nhau, nên lớp dịch vụ chỉ khai báo mình cần gì chứ không tự dựng phụ thuộc. Dữ liệu xuống cơ sở dữ liệu qua ánh xạ đối tượng–quan hệ: một lớp @Entity ứng với một bảng, quan hệ một-nhiều hay nhiều-nhiều được khai báo bằng annotation, và việc nạp dữ liệu liên quan sớm hay muộn định ra bao nhiêu câu truy vấn thật sự chạy. Trên lớp ánh xạ ấy, repository chỉ cần một interface, còn tên phương thức như findByEmail đủ để sinh truy vấn. Cùng lối tách giao diện khỏi dữ liệu được dùng lại cho ứng dụng máy tính để bàn, nơi cửa sổ, Scene và các điều khiển được dựng bằng mã Java hoặc tệp FXML. Spring Boot gom các mảnh đó bằng cấu hình tự động và các gói khởi động, để một dự án chạy được chỉ với một lớp main và vài dòng thuộc tính. Các khái niệm cần nắm chắc gồm th:each, bean, ObservableList, JpaRepository, Scene, Dependency Injection, @RestController và persistence context. Học xong, người học lần theo được đường đi của một yêu cầu qua các tầng, tự thiết kế lớp thực thể cùng quan hệ giữa chúng, viết controller trả trang Thymeleaf hoặc dữ liệu REST, chọn đúng phạm vi cho bean, và dựng một ứng dụng thêm, sửa, xoá có giao diện bằng JavaFX.

179Câu hỏi
5Bộ đề
9Chủ đề
Thử sức tại chỗ

Trả lời ngay tại đây

Chưa trả lời câu nào
1HSF302 - Phần 1: JPA và ánh xạ đối tượng–quan hệ
If you have a Student entity and a Course entity with a Many-to-Many relationship, and you want to fetch all students enrolled in a specific course, how would you typically structure the query in JPA?
2HSF302 - Phần 2: IoC và Dependency Injection trong Spring
Spring Beans are managed by which container?
3HSF302 - Phần 2: IoC và Dependency Injection trong Spring

Consider the following Java code snippet:

Đề bài
public class MyService {
    private MyDependency dependency;

    public void setDependency(MyDependency dependency) {
        this.dependency = dependency;
    }

    public void performAction() {
        dependency.doSomething();
    }
}

Which Spring Core Container feature is being demonstrated in this code?

Còn 3 câu nữa ở trên

Trả lời hết các câu trên để xem tổng kết, hoặc vào phiên học ngay.

Học từ ngân hàng câu hỏi

Bắt đầu một phiên học theo môn

Tiến độ của bạn luôn được tính và đồng bộ trực tiếp theo tổng số lượng câu hỏi mới nhất của môn học này.

179Ngân hàng hiện tại--Tiến độ môn

Câu hỏi của môn

24/179 câuCòn 155
A@OneToOne
B@ManyToOne
C@OneToMany
D@ManyToMany
Lời giải
Đáp án đúng: "@ManyToMany". Annotation @ManyToMany của đặc tả JPA đánh dấu một thuộc tính tập hợp mà mỗi phía có thể liên kết với nhiều bản ghi của phía kia, ví dụ một sinh viên học nhiều khoá học và một khoá học có nhiều sinh viên; quan hệ này được lưu qua một bảng nối (join table), có thể đặt tên và cột bằng @JoinTable ở phía sở hữu, phía còn lại dùng mappedBy. "@OneToOne" chỉ dùng khi mỗi thực thể gắn với đúng một thực thể kia, như người dùng và hồ sơ cá nhân. "@ManyToOne" mô tả phía nhiều trỏ về một, như nhiều đơn hàng thuộc một khách hàng, khoá ngoại nằm trên bảng phía nhiều. "@OneToMany" là chiều ngược lại của quan hệ đó, một khách hàng có nhiều đơn hàng, nhưng mỗi đơn hàng vẫn chỉ thuộc một khách hàng nên không diễn tả được quan hệ nhiều-nhiều.
Mở trang câu hỏi này →
AAfter
BAfterReturning
CBefore
DAround
Lời giải
Đáp án đúng: "Before". Trong AOP (lập trình hướng khía cạnh) của Spring, advice là đoạn mã được chèn vào tại một join point (điểm nối, với Spring AOP là lời gọi phương thức); advice loại Before, khai báo bằng @Before, chạy trước khi phương thức đích thực thi và không chặn được lời gọi trừ khi ném ngoại lệ. "After" (@After) chạy sau khi phương thức kết thúc bất kể trả về bình thường hay ném ngoại lệ, giống khối finally. "AfterReturning" (@AfterReturning) chỉ chạy sau khi phương thức trả về thành công và có thể đọc giá trị trả về. "Around" (@Around) bao quanh join point, có thể chạy mã cả trước lẫn sau và tự quyết định có gọi proceed() hay không; nó làm được việc chạy trước nhưng không phải loại advice được định nghĩa riêng cho thời điểm trước join point.
Mở trang câu hỏi này →
ALabel
BButton
CTextField
DImageView
Lời giải
Đáp án đúng: "TextField". Trong JavaFX, TextField là control (thành phần điều khiển) cho phép người dùng gõ một dòng văn bản; chương trình đọc nội dung bằng getText() và đặt nội dung bằng setText(), còn khi cần nhập nhiều dòng thì dùng TextArea, nhập mật khẩu thì dùng PasswordField, đều là họ hàng của TextInputControl. "Label" chỉ hiển thị một đoạn chữ tĩnh, người dùng không gõ vào được, thường đặt cạnh ô nhập để làm nhãn. "Button" là nút bấm, nhận thao tác nhấn và phát ActionEvent chứ không nhận văn bản gõ vào. "ImageView" dùng để hiển thị một đối tượng Image như ảnh PNG hay JPG trên giao diện, hoàn toàn không có chức năng nhập liệu.
Mở trang câu hỏi này →
AScene scene = new Scene(new Button("Click Me"));
BStage stage = new Stage(new Button("Click Me"));
CButton button = new Button("Click Me");
DNode node = new Node(new Button("Click Me"));
Lời giải

Đáp án đúng: "Scene scene = new Scene(new Button("Click Me")); ". Trong JavaFX, Scene là vùng chứa toàn bộ đồ thị nút (scene graph) và constructor của nó nhận một Parent làm nút gốc; Button kế thừa Control, Control kế thừa Region rồi Parent, nên truyền thẳng một Button vào constructor của Scene là hợp lệ và nút đó trở thành gốc của cảnh, tức đã được đưa vào scene. "Stage stage = new Stage(new Button("Click Me")); " không biên dịch được vì Stage là cửa sổ, chỉ có constructor rỗng hoặc nhận StageStyle, và nội dung được gắn vào Stage qua setScene chứ không phải qua một nút. "Button button = new Button("Click Me"); " chỉ tạo ra đối tượng nút trong bộ nhớ, chưa gắn vào layout hay Scene nào nên chưa hiện lên màn hình. "Node node = new Node(new Button("Click Me")); " sai vì Node là lớp trừu tượng, không thể new trực tiếp và cũng không có constructor nhận một nút con.

Mở trang câu hỏi này →
A<fxml controller="MyController" />
B<fx:controller type="MyController" />
C<fx:controller fx:id="controller" value="MyController" />
D<fx:controller value="MyController" />
Lời giải

Đáp án đúng: "<fx:controller fx:id="controller" value="MyController" />". Cần nói thẳng: trong FXML thật không có phần tử nào tên fx:controller; controller được gắn bằng thuộc tính fx:controller đặt trên phần tử gốc của tệp, ví dụ <VBox fx:controller="com.foo.MyController">, rồi FXMLLoader tạo đối tượng lớp đó và tiêm các trường @FXML theo fx:id. Vì vậy cả bốn phương án đều không phải cú pháp chạy được, và đáp án ở đây được giữ theo khoá của đề chứ không có căn cứ kỹ thuật nào để xếp nó trên phương án chỉ có value: cả hai cùng mang ý khai báo lớp controller MyController qua tên fx:controller, còn thuộc tính fx:id thêm vào không đóng vai trò gì trong việc gắn controller, nó chỉ đặt định danh cho một phần tử. "<fxml controller="MyController" /> " sai vì FXML không có thẻ fxml, và controller ở đây thiếu tiền tố fx. "<fx:controller type="MyController" />" sai vì type không phải thuộc tính dùng để gắn controller. "<fx:controller value="MyController" />" cũng sai cú pháp y như vậy vì vẫn dùng một phần tử fx:controller không tồn tại.

Mở trang câu hỏi này →
ATo define database connections.
BTo initialize and show the application window.
CTo handle network requests.
DTo manage application configurations.
Lời giải
Đáp án đúng: "To initialize and show the application window.". Khi một ứng dụng JavaFX khởi chạy, runtime gọi init() rồi gọi start(Stage primaryStage) trên luồng JavaFX Application Thread, truyền vào primaryStage là cửa sổ chính do nền tảng tạo sẵn; trong start, lập trình viên dựng scene graph, gắn Scene vào Stage, đặt tiêu đề rồi gọi primaryStage.show() để cửa sổ hiện ra. "To define database connections." sai vì kết nối cơ sở dữ liệu thuộc tầng truy cập dữ liệu, không phải nhiệm vụ của phương thức vòng đời này, và mở kết nối nặng trong start còn làm treo giao diện. "To handle network requests." sai vì JavaFX không định tuyến yêu cầu mạng qua start; việc đó nên chạy trong Task hoặc luồng nền. "To manage application configurations." sai vì cấu hình thường đọc từ tệp hoặc tham số qua getParameters(), có thể làm trong init(), còn mục đích cốt lõi của start là dựng và hiển thị cửa sổ.
Mở trang câu hỏi này →
11Which method launches a JavaFX app?4 lựa chọn
Amain()
Bstart()
Claunch()
Drun()
Lời giải
Đáp án đúng: "launch()". Phương thức tĩnh Application.launch() là thứ khởi động một ứng dụng JavaFX: nó dựng runtime JavaFX, tạo một thể hiện của lớp con Application, gọi init() rồi gọi start(Stage) trên luồng JavaFX Application Thread với Stage chính đã được tạo sẵn, và chỉ trả về khi ứng dụng thoát. "main()" là điểm vào của JVM; trong ứng dụng JavaFX, main thường chỉ có một dòng gọi launch(args), tự nó không khởi động bộ công cụ đồ hoạ. "start()" là phương thức trừu tượng mà lập trình viên ghi đè để dựng Scene, nó được runtime gọi sau khi launch chạy chứ người lập trình không gọi trực tiếp để khởi động ứng dụng. "run()" là phương thức của Runnable hay Thread, dùng cho luồng thông thường hoặc Platform.runLater, không phải cách khởi chạy ứng dụng JavaFX.
Mở trang câu hỏi này →
ATo manage database connections.
BTo process user requests and return a model and view.
CTo define user interfaces.
DTo configure application security.
Lời giải
Đáp án đúng: "To process user requests and return a model and view.". Trong Spring MVC, DispatcherServlet nhận yêu cầu HTTP rồi chuyển cho phương thức xử lý (handler) nằm trong lớp gắn @Controller; phương thức này đọc tham số, gọi tầng service, đặt dữ liệu vào Model và trả về tên view logic (hoặc một ModelAndView) để ViewResolver tìm template hiển thị, đúng vai trò bộ điều khiển trong mô hình Model–View–Controller. "To manage database connections." là việc của DataSource và bể kết nối như HikariCP, controller chỉ gọi gián tiếp qua service và repository. "To define user interfaces." thuộc về tầng View, tức các template Thymeleaf hay JSP, controller không mô tả giao diện. "To configure application security." do Spring Security đảm nhận qua chuỗi filter và bean cấu hình SecurityFilterChain, chạy trước khi yêu cầu tới controller.
Mở trang câu hỏi này →
AIt tightly couples the components
BIt reduces testability of code
CIt promotes loose coupling between components
DIt is required only for web apps
Lời giải
Đáp án đúng: "It promotes loose coupling between components". Dependency Injection (tiêm phụ thuộc) nghĩa là đối tượng không tự new các phụ thuộc mà được IoC container của Spring đưa vào qua constructor, setter hoặc trường; lớp chỉ phụ thuộc vào interface nên có thể thay hiện thực khác mà không sửa mã, đó chính là liên kết lỏng (loose coupling). "It tightly couples the components" nói ngược bản chất, liên kết chặt là tình trạng lớp tự tạo phụ thuộc cụ thể, thứ DI loại bỏ. "It reduces testability of code" cũng ngược lại: nhờ phụ thuộc được truyền từ ngoài, khi kiểm thử đơn vị ta dễ đưa vào mock hoặc stub thay cho cơ sở dữ liệu hay dịch vụ thật. "It is required only for web apps" sai vì DI là cơ chế của Spring Core, dùng cho mọi loại ứng dụng từ ứng dụng dòng lệnh, ứng dụng desktop tới dịch vụ web, và không phải yêu cầu riêng của ứng dụng web.
Mở trang câu hỏi này →
A@PathVariable binds a query parameter; @RequestParam binds a URI template variable
B@PathVariable binds a URI template variable; @RequestParam binds a query parameter or form field
CBoth only bind data from HTTP headers
DBoth require a ModelAndView return type
Lời giải
Đáp án đúng: "@PathVariable binds a URI template variable; @RequestParam binds a query parameter or form field". Với ánh xạ @GetMapping("/users/{id}"), @PathVariable lấy giá trị của biến mẫu id nằm ngay trong đường dẫn, ví dụ /users/42 cho id bằng 42; còn @RequestParam đọc tham số truy vấn sau dấu hỏi như /users?page=2, và với Servlet API thì cũng đọc được trường của form gửi lên dạng application/x-www-form-urlencoded. "@PathVariable binds a query parameter; @RequestParam binds a URI template variable" đảo ngược đúng hai vai trò này. "Both only bind data from HTTP headers" sai vì đọc header là việc của @RequestHeader, còn hai annotation được hỏi đọc dữ liệu từ URI và tham số yêu cầu. "Both require a ModelAndView return type" sai vì kiểu trả về của phương thức xử lý độc lập với cách gắn tham số: có thể trả String tên view, đối tượng được chuyển thành JSON trong @RestController, ResponseEntity hay void.
Mở trang câu hỏi này →
Đề bài
public class AppStarter {
  public static void main(String[] args) {
    SpringApplication.run(AppStarter.class, args);
  }
}
A@SpringBoot
B@App
C@SpringApplication
D@SpringBootApplication
Lời giải
Đáp án đúng: "@SpringBootApplication". Annotation này đánh dấu lớp chính của ứng dụng Spring Boot và là annotation gộp của ba thứ: @SpringBootConfiguration (lớp là nguồn cấu hình), @EnableAutoConfiguration (bật tự cấu hình dựa trên thư viện có trong classpath) và @ComponentScan (quét bean trong gói của lớp và các gói con); phương thức main gọi SpringApplication.run(AppStarter.class, args) để dựng ApplicationContext và khởi động server nhúng. "@SpringBoot" không phải annotation có thật trong Spring Boot, chỉ là tên rút gọn gây nhầm. "@App" cũng không tồn tại trong Spring. "@SpringApplication" dễ nhầm nhất vì SpringApplication đúng là có thật, nhưng đó là một lớp với phương thức tĩnh run dùng trong main, không phải annotation để gắn lên lớp.
Mở trang câu hỏi này →
16Which object holds model data?4 lựa chọn
AModel
BEntity
CView
DContext
Lời giải
Đáp án đúng: "Model". Trong Spring MVC, phương thức controller có thể khai báo tham số kiểu Model (org.springframework.ui.Model) rồi gọi addAttribute để đặt dữ liệu; sau khi phương thức trả về tên view, DispatcherServlet chuyển các thuộc tính này cho template, nên Thymeleaf đọc được chúng bằng biểu thức như ${products}. Model vì thế là đối tượng giữ dữ liệu đi từ controller sang view. "Entity" là lớp gắn @Entity ánh xạ tới bảng trong cơ sở dữ liệu; một entity có thể được đặt vào Model như một thuộc tính, nhưng bản thân nó là dữ liệu nghiệp vụ chứ không phải nơi chứa dữ liệu cho view. "View" là thành phần hiển thị, nó đọc dữ liệu từ model chứ không giữ dữ liệu. "Context" gợi tới ApplicationContext, tức container IoC quản lý bean, không phải chỗ truyền dữ liệu của một yêu cầu tới giao diện.
Mở trang câu hỏi này →
ARepository layer
BService layer
CController layer
DView layer
Lời giải
Đáp án đúng: "Service layer". Trong kiến trúc phân lớp thường dùng với Spring, lớp dịch vụ đánh dấu bằng @Service chứa logic nghiệp vụ: kiểm tra quy tắc, tính toán, phối hợp nhiều repository và thường là nơi đặt ranh giới giao dịch @Transactional. "Repository layer" chỉ lo truy cập dữ liệu như lưu, tìm, xoá thực thể qua JpaRepository, không nên chứa quy tắc nghiệp vụ. "Controller layer" nhận yêu cầu HTTP, đọc tham số, gọi service rồi trả về view hoặc dữ liệu; nhồi logic nghiệp vụ vào đây làm controller phình to và khó tái sử dụng. "View layer" chỉ hiển thị dữ liệu cho người dùng, ví dụ trang Thymeleaf, không quyết định nghiệp vụ. Tách như vậy giúp mỗi lớp có một trách nhiệm và kiểm thử riêng được.
Mở trang câu hỏi này →
ASpring Boot DevTools
BSpring Boot Actuator
CSpringApplication
DSpring Boot Test
Lời giải
Đáp án đúng: "Spring Boot DevTools". Thêm phụ thuộc spring-boot-devtools vào dự án thì khi tệp trên classpath thay đổi, ứng dụng tự khởi động lại nhanh nhờ hai classloader (một giữ thư viện bên thứ ba không đổi, một nạp lại mã của dự án), đồng thời DevTools chạy một máy chủ LiveReload để trình duyệt tự làm mới khi tài nguyên đổi; nó còn tắt bộ nhớ đệm template khi phát triển và tự vô hiệu khi chạy bản đóng gói production. "Spring Boot Actuator" cung cấp các endpoint giám sát như health, metrics, info cho ứng dụng đang chạy, không nạp lại mã. "SpringApplication" là lớp khởi động ứng dụng qua SpringApplication.run, tạo ApplicationContext, không theo dõi thay đổi tệp. "Spring Boot Test" cung cấp công cụ kiểm thử như @SpringBootTest, JUnit, Mockito, phục vụ viết test chứ không tăng tốc vòng sửa mã và xem kết quả.
Mở trang câu hỏi này →
AThey require separate installation and configuration.
BThey simplify deployment and reduce the need for external application servers.
CThey offer limited performance compared to external servers.
DThey are only compatible with specific operating systems.
Lời giải
Đáp án đúng: "They simplify deployment and reduce the need for external application servers.". Spring Boot đóng gói sẵn server nhúng (embedded server) như Tomcat, Jetty hoặc Undertow vào ứng dụng, nên toàn bộ ứng dụng thành một tệp jar chạy được bằng java -jar, không phải cài Tomcat riêng rồi triển khai tệp war vào đó; cấu hình cổng hay đường dẫn chỉ cần sửa trong application.properties, rất hợp với container và microservice. "They require separate installation and configuration." nói ngược lại bản chất, vì server nhúng đi kèm như một dependency, không cần cài đặt riêng. "They offer limited performance compared to external servers." sai vì server nhúng chính là Tomcat, Jetty hay Undertow thật, hiệu năng tương đương bản cài ngoài. "They are only compatible with specific operating systems." sai vì server nhúng là thư viện Java, chạy trên mọi hệ điều hành có JVM.
Mở trang câu hỏi này →
AHard-coding all configuration inside Java classes
BPacking configuration into compiled bytecode for security
CSupplying settings (e.g., database details) via properties/YAML and environment so the same build can run in different environments
DRequiring a separate XML file for every bean definition
Lời giải
Đáp án đúng: "Supplying settings (e.g., database details) via properties/YAML and environment so the same build can run in different environments". Externalized configuration (cấu hình đặt bên ngoài mã) nghĩa là Spring Boot đọc giá trị cấu hình từ nhiều nguồn có thứ tự ưu tiên như application.properties hoặc application.yml, tệp theo profile kiểu application-prod.yml, biến môi trường và tham số dòng lệnh, rồi đưa vào bean qua @Value hoặc @ConfigurationProperties; nhờ vậy cùng một tệp jar có thể chạy ở môi trường dev, test hay production chỉ bằng cách đổi URL cơ sở dữ liệu, mật khẩu hay cổng mà không biên dịch lại. "Hard-coding all configuration inside Java classes" đi ngược hẳn ý tưởng này, vì mọi thay đổi đều buộc sửa mã và build lại. "Packing configuration into compiled bytecode for security" cũng là gắn chết cấu hình vào bản build, đồng thời không mang lại bảo mật thật; bí mật nên để ở biến môi trường hoặc kho bí mật. "Requiring a separate XML file for every bean definition" mô tả kiểu khai báo bean bằng XML thời Spring cũ, là chuyện định nghĩa bean chứ không phải tách giá trị cấu hình ra khỏi bản build, và Spring Boot vốn hướng tới giảm XML.
Mở trang câu hỏi này →
AVBox
BFlowPane
CBorderPane
DHBox
Lời giải
Đáp án đúng: "HBox". Trong JavaFX, HBox (horizontal box) là layout pane xếp các node con thành một hàng ngang theo thứ tự thêm vào, có thể chỉnh khoảng cách bằng spacing và căn lề bằng alignment, padding. "VBox" là bản dọc tương ứng, xếp các node con thành một cột từ trên xuống dưới. "FlowPane" cũng xếp theo hàng ngang ở chế độ mặc định nhưng tự xuống dòng khi hết chiều rộng, tức bố cục chảy nhiều hàng chứ không giữ một hàng duy nhất, nên không phải layout chuyên cho một hàng ngang. "BorderPane" chia vùng thành năm khu top, bottom, left, right và center, dùng để dựng khung cửa sổ như thanh menu ở trên và nội dung ở giữa, chứ không xếp các con thành hàng.
Mở trang câu hỏi này →
AEnhancing security for the web application.
BProviding a way to create reusable template layouts.
CManaging database connections.
DOptimizing JavaScript performance.
Lời giải
Đáp án đúng: "Providing a way to create reusable template layouts.". Thymeleaf Layout Dialect là phần mở rộng thêm các thuộc tính như layout:decorate và layout:fragment: ta viết một trang khung (layout) chứa phần đầu, menu, chân trang dùng chung, rồi mỗi trang nội dung khai báo trang khung nào sẽ bao lấy nó và chỉ điền vào các vùng fragment riêng, nhờ vậy bố cục được tái sử dụng thay vì chép lặp ở mọi trang. "Enhancing security for the web application." sai vì bảo mật thuộc Spring Security, còn phần tích hợp Thymeleaf với bảo mật là một dialect khác (thymeleaf-extras-springsecurity). "Managing database connections." sai vì Thymeleaf chỉ là template engine (bộ máy dựng khuôn mẫu) ở tầng view, không chạm tới cơ sở dữ liệu. "Optimizing JavaScript performance." sai vì dialect này xử lý HTML phía máy chủ, không can thiệp vào hiệu năng mã JavaScript chạy trên trình duyệt.
Mở trang câu hỏi này →
ADatabase drivers.
BHTML attributes and elements.
CSecurity protocols.
DNetwork configurations.
Lời giải
Đáp án đúng: "HTML attributes and elements.". Standard Dialect (phương ngữ chuẩn) của Thymeleaf là bộ processor định nghĩa các thuộc tính như th:text, th:each, th:if, th:href và phần tử như th:block, cùng cú pháp biểu thức chuẩn ${...}, *{...}, #{...}, @{...}; nhờ chúng mà tệp HTML vẫn mở được bằng trình duyệt như một bản mẫu tĩnh nhưng khi Thymeleaf xử lý thì được thay bằng dữ liệu thật. "Database drivers." là trình điều khiển JDBC để kết nối cơ sở dữ liệu, thuộc tầng truy cập dữ liệu chứ không thuộc engine template. "Security protocols." như TLS hay OAuth do tầng bảo mật như Spring Security đảm nhận, Thymeleaf chỉ có dialect bổ sung riêng để đọc thông tin bảo mật. "Network configurations." không liên quan, Thymeleaf chỉ sinh nội dung giao diện.
Mở trang câu hỏi này →
24Thymeleaf is primarily used for:4 lựa chọn
AHandling database transactions.
BGenerating dynamic HTML content.
CManaging application security.
DBuilding REST APIs.
Lời giải
Đáp án đúng: "Generating dynamic HTML content.". Thymeleaf là template engine (bộ máy mẫu) phía máy chủ: controller trả về tên view, ViewResolver tìm tệp .html trong thư mục templates, rồi Thymeleaf xử lý các thuộc tính như th:text, th:each, th:if để điền dữ liệu từ Model vào và sinh ra trang HTML hoàn chỉnh gửi cho trình duyệt. Điểm mạnh của nó là template vẫn là HTML hợp lệ, mở thẳng trên trình duyệt được (natural template). "Handling database transactions." là việc của @Transactional và PlatformTransactionManager ở tầng service, Thymeleaf không chạm vào cơ sở dữ liệu. "Managing application security." do Spring Security đảm nhận; Thymeleaf chỉ có module phụ để ẩn hiện phần tử theo quyền chứ không quản lý bảo mật. "Building REST APIs." dùng @RestController trả JSON trực tiếp vào thân phản hồi, không cần template HTML.
Mở trang câu hỏi này →