Danh sách câu hỏi của đề

Câu hỏi: HSF302 Làm việc với Spring Framework – Bộ ôn tập thi lại số 2

50 câu trắc nghiệm kèm lời giải của môn HSF302 - Làm việc với Spring Framework, xếp đúng thứ tự trong đề. Trang 2/3 — câu 21–40.

Danh sách câu hỏi

40/50 câuCòn 10
21You have a controller: @RestController4 lựa chọncó code
Đề bài
class TestController {
  @GetMapping("/hello")
  public String hello() { return "Hi"; }
}

What is the response of GET /hello request?

AHTML page
BJSON object {"hello":"Hi"}
CPlain text 'Hi'
DError 404
Lời giải
Đáp án đúng: "Plain text 'Hi'". @RestController là gộp của @Controller và @ResponseBody, nên giá trị trả về của hello() không bị coi là tên view mà được ghi thẳng vào thân phản hồi; vì kiểu trả về là String, Spring chọn StringHttpMessageConverter và gửi về đúng chuỗi Hi dạng văn bản thuần. "HTML page" chỉ xảy ra với @Controller thường, khi chuỗi trả về được ViewResolver hiểu là tên template cần render. "JSON object {"hello":"Hi"}" sai vì chỉ đối tượng như Map hay một lớp có trường hello mới được Jackson chuyển thành JSON có khoá, còn một String đơn lẻ được ghi ra nguyên văn, không tự gói vào khoá nào. "Error 404" sai vì @GetMapping("/hello") đã ánh xạ đúng đường dẫn và phương thức GET, nên yêu cầu tìm được handler.
Mở trang câu hỏi này →
ADispatcherServlet
BEntityManager
CJdbcTemplate
DApplicationContext
Lời giải
Đáp án đúng: "DispatcherServlet". Trong Spring Web MVC, DispatcherServlet là front controller (bộ điều khiển trung tâm) nhận mọi yêu cầu HTTP, hỏi HandlerMapping để tìm controller phù hợp, nhờ HandlerAdapter gọi phương thức, rồi dùng ViewResolver hoặc HttpMessageConverter để tạo phản hồi; Spring Boot tự đăng ký servlet này cho đường dẫn gốc. "EntityManager" là giao diện của JPA để thao tác thực thể với cơ sở dữ liệu, thuộc tầng dữ liệu chứ không nhận yêu cầu HTTP. "JdbcTemplate" là lớp tiện ích chạy câu lệnh SQL qua JDBC. "ApplicationContext" là IoC container chứa và quản lý mọi bean, kể cả DispatcherServlet, nhưng bản thân nó không xử lý yêu cầu HTTP.
Mở trang câu hỏi này →
AURL expressions.
BMessage expressions.
CVariable expressions.
DFragment expressions.
Lời giải
Đáp án đúng: "Variable expressions.". Trong cú pháp biểu thức chuẩn của Thymeleaf, ${...} là biểu thức biến: nó được đánh giá trên ngữ cảnh, tức các thuộc tính mà controller đã đưa vào Model, bằng OGNL hoặc SpEL khi tích hợp Spring, ví dụ th:text="${user.name}" lấy thuộc tính name của đối tượng user. "URL expressions." là cú pháp @{...}, dùng để dựng đường dẫn liên kết có context path. "Message expressions." là cú pháp #{...}, dùng để tra khoá trong tệp messages phục vụ đa ngôn ngữ. "Fragment expressions." là cú pháp ~{...}, dùng với th:insert hoặc th:replace để chèn một mảnh template vào trang.
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 →
25What is the result of this Thymeleaf fragment?4 lựa chọncó code
Đề bài
<span th:if="${user.loggedIn}">Welcome!</span>
ARenders always
BDisplays if user.loggedIn is false
CDisplays nothing by default
DDisplays "Welcome!" only if user is logged in
Lời giải
Đáp án đúng: "Displays "Welcome!" only if user is logged in". Thuộc tính th:if của Thymeleaf đánh giá biểu thức user.loggedIn trên đối tượng user trong model lúc dựng trang ở máy chủ; nếu kết quả là true thì thẻ span cùng dòng chữ Welcome! được giữ lại trong HTML trả về, còn nếu false hoặc null thì Thymeleaf loại bỏ hẳn cả thẻ khỏi đầu ra chứ không chỉ ẩn bằng CSS. "Renders always" sai vì phần tử mang th:if chỉ được dựng khi điều kiện đúng; muốn luôn hiển thị thì bỏ th:if đi. "Displays if user.loggedIn is false" đảo ngược điều kiện, đó là hành vi của th:unless chứ không phải th:if. "Displays nothing by default" sai vì không có cơ chế mặc định ẩn nào: kết quả phụ thuộc hoàn toàn vào giá trị loggedIn lúc dựng trang, đúng thì lời chào vẫn hiện ra.
Mở trang câu hỏi này →
26Thymeleaf can be used to process:4 lựa chọn
AOnly HTML files.
BHTML, XML, JavaScript, CSS, and plain text.
COnly server-side Java code.
DOnly database queries.
Lời giải
Đáp án đúng: "HTML, XML, JavaScript, CSS, and plain text.". Thymeleaf là template engine (bộ máy mẫu) phía server cho Java, hỗ trợ sáu chế độ mẫu: HTML và XML là chế độ đánh dấu, TEXT, JAVASCRIPT và CSS là chế độ văn bản, cùng RAW để xuất nguyên văn; nhờ vậy nó sinh được trang web, tệp XML, đoạn script hay nội dung email dạng văn bản thuần. "Only HTML files." sai vì HTML chỉ là chế độ thường gặp nhất trong Spring MVC chứ không phải duy nhất. "Only server-side Java code." sai vì Thymeleaf không xử lý mã Java, nó xử lý mẫu và chỉ đọc dữ liệu từ model qua biểu thức. "Only database queries." sai vì truy vấn cơ sở dữ liệu là việc của JPA hay JDBC, Thymeleaf không truy cập cơ sở dữ liệu.
Mở trang câu hỏi này →
Asave()
Binsert()
Cpersist()
Dstore()
Lời giải
Đáp án đúng: "persist()". Trong JPA, EntityManager.persist(entity) đưa một thực thể mới từ trạng thái transient (tạm thời) vào persistence context để nó thành managed; câu lệnh INSERT thực sự được gửi khi flush hoặc khi transaction commit. EntityManager còn có merge, remove, find, nhưng thêm mới là persist. "save()" là chỗ dễ nhầm: đó là phương thức của repository trong Spring Data JPA, và bên trong SimpleJpaRepository.save lại gọi persist hoặc merge tuỳ thực thể mới hay cũ, nó cũng có trong Session của Hibernate, nhưng không thuộc EntityManager. "insert()" không có trong API EntityManager, INSERT là câu SQL do JPA tự sinh. "store()" cũng không phải phương thức của EntityManager.
Mở trang câu hỏi này →
Aem.detach(entity)
Bem.persist(entity)
Cem.clear()
Dem.flush()
Lời giải
Đáp án đúng: "em.persist(entity)". Entity ở trạng thái transient (tạm thời) là đối tượng vừa new, chưa gắn với persistence context và chưa có dòng tương ứng trong cơ sở dữ liệu; gọi persist trong một giao dịch sẽ đưa nó sang trạng thái managed, provider lên lịch câu INSERT và thực thi khi flush hoặc commit, còn khoá chính có thể được gán ngay nếu dùng chiến lược IDENTITY. "em.detach(entity)" làm ngược lại, tách một entity managed ra khỏi persistence context để nó thành detached. "em.clear()" tách toàn bộ entity đang được quản lý, xoá sạch persistence context. "em.flush()" chỉ đẩy các thay đổi đang chờ của entity đã managed xuống cơ sở dữ liệu; nó không đưa một đối tượng transient vào quản lý, nên entity mới tạo mà chưa persist sẽ không được ghi.
Mở trang câu hỏi này →
AManaging user interfaces
BProviding RESTful API support
CManaging relational data through ORM
DRunning multithreaded processes
Lời giải
Đáp án đúng: "Managing relational data through ORM". Vai trò chính của JPA là quản lý dữ liệu quan hệ thông qua ORM (Object-Relational Mapping, ánh xạ đối tượng sang quan hệ): lập trình viên làm việc với đối tượng Java gắn @Entity, còn EntityManager cùng nhà cung cấp như Hibernate lo sinh SQL, đồng bộ thay đổi trong persistence context xuống bảng và nạp hàng trong bảng lên thành đối tượng. "Managing user interfaces" là việc của JavaFX, Swing hoặc tầng view như Thymeleaf. "Providing RESTful API support" thuộc về Spring MVC với @RestController hay Jakarta REST, JPA chỉ lo phần lưu trữ phía sau. "Running multithreaded processes" là phạm vi của java.util.concurrent, ExecutorService, không phải đặc tả lưu trữ dữ liệu.
Mở trang câu hỏi này →
A@OneToMany
B@ManyToOne
C@OneToOne
D@Autowired
Lời giải
Đáp án đúng: "@Autowired". Câu hỏi tìm annotation KHÔNG thuộc nhóm quan hệ của JPA. @Autowired là annotation của Spring dùng để tiêm phụ thuộc, yêu cầu container tìm bean phù hợp theo kiểu rồi gán vào trường, setter hay constructor; nó không mô tả quan hệ giữa các entity. "@OneToMany" là annotation quan hệ chuẩn trong jakarta.persistence, đặt ở phía một để giữ tập hợp nhiều entity con, ví dụ một Department có nhiều Employee, nên nó thuộc nhóm và không được chọn. "@ManyToOne" cũng là quan hệ chuẩn, đặt ở phía nhiều và thường kèm @JoinColumn chỉ cột khoá ngoại. "@OneToOne" là quan hệ chuẩn một một, như User với hồ sơ Profile. Cùng với @ManyToMany, chúng tạo thành bốn annotation quan hệ của đặc tả JPA.
Mở trang câu hỏi này →
A@Column
B@Entity
C@OneToMany
D@Transient
Lời giải
Đáp án đúng: "@OneToMany". Annotation quan hệ trong JPA mô tả cách một thực thể liên kết với thực thể khác; @OneToMany đặt trên thuộc tính tập hợp, ví dụ một Department có danh sách Employee, cho biết một bản ghi phía này gắn với nhiều bản ghi phía kia, thường đi cặp với @ManyToOne ở phía nhiều qua mappedBy. Cùng nhóm còn có @OneToOne, @ManyToOne và @ManyToMany. "@Column" chỉ cấu hình ánh xạ một trường kiểu đơn tới cột của bảng. "@Entity" khai báo lớp là thực thể, không mô tả liên kết giữa các thực thể. "@Transient" đánh dấu trường không được lưu xuống cơ sở dữ liệu, ngược hẳn với việc ánh xạ một quan hệ.
Mở trang câu hỏi này →
32What is JPQL primarily used for?4 lựa chọn
AQuerying entities and their relationships in an object-oriented way
BDefining database connection pools
CGenerating database schemas automatically from UML
DEncrypting fields before persistence
Lời giải
Đáp án đúng: "Querying entities and their relationships in an object-oriented way". JPQL (Java Persistence Query Language) là ngôn ngữ truy vấn của JPA viết trên tên lớp thực thể và thuộc tính chứ không trên tên bảng, cột, ví dụ SELECT s FROM Student s JOIN s.courses c. Persistence provider dịch nó sang SQL của từng cơ sở dữ liệu, và có thể đi theo quan hệ giữa các thực thể bằng dấu chấm hoặc JOIN. "Defining database connection pools" là việc của cấu hình DataSource và pool như HikariCP. "Generating database schemas automatically from UML" sai vì JPQL không đọc UML; việc sinh schema từ thực thể do provider làm qua thuộc tính như hibernate.hbm2ddl.auto, không liên quan JPQL. "Encrypting fields before persistence" thuộc AttributeConverter hoặc thư viện mã hoá, không phải ngôn ngữ truy vấn.
Mở trang câu hỏi này →
ALabel or Alert
BButton
CTableView
DTextField
Lời giải
Đáp án đúng: "Label or Alert". Thông báo lỗi validation cần được hiển thị cho người dùng đọc: Label đặt ngay cạnh hoặc dưới ô nhập, đổi chữ và màu đỏ bằng setText và setStyle, hợp để báo lỗi tại chỗ từng trường; còn Alert là hộp thoại kiểu AlertType.ERROR hay AlertType.WARNING bật lên bằng showAndWait, hợp để báo lỗi tổng hợp khi bấm lưu. "Button" là control để người dùng kích hoạt hành động, không dùng để trình bày thông báo. "TableView" hiển thị danh sách dữ liệu nhiều hàng nhiều cột, quá nặng và sai mục đích cho một câu báo lỗi. "TextField" là ô cho người dùng nhập liệu; nhét thông báo lỗi vào đó sẽ lẫn với dữ liệu người dùng gõ, dù có thể tô viền đỏ ô này để đánh dấu trường sai bên cạnh Label.
Mở trang câu hỏi này →
ATo improve database performance.
BTo ensure data integrity and prevent errors.
CTo enhance user interface aesthetics.
DTo manage server configurations.
Lời giải
Đáp án đúng: "To ensure data integrity and prevent errors.". Trong ứng dụng JavaFX có thao tác CRUD (tạo, đọc, cập nhật, xoá), kiểm tra hợp lệ (validation) là bước kiểm dữ liệu người dùng nhập trên form, chẳng hạn trường bắt buộc không rỗng, email đúng định dạng, số lượng là số dương, trước khi gọi tầng service để lưu; dữ liệu sai bị chặn và báo lỗi ngay trên giao diện, nhờ vậy cơ sở dữ liệu giữ được tính toàn vẹn và tránh ngoại lệ do vi phạm ràng buộc. "To improve database performance." sai vì kiểm tra hợp lệ không làm truy vấn nhanh hơn; hiệu năng phụ thuộc chỉ mục và thiết kế truy vấn. "To enhance user interface aesthetics." sai vì thông báo lỗi có hiện trên giao diện nhưng mục đích là đúng dữ liệu, không phải thẩm mỹ. "To manage server configurations." sai vì cấu hình máy chủ là việc triển khai, không liên quan tới kiểm dữ liệu nhập.
Mở trang câu hỏi này →
Aem.persist(entity);
Bem.remove(entity);
Cem.find(Entity.class, id);
Dem.merge(entity);
Lời giải

Đáp án đúng: "em.find(Entity.class, id); ". Phương thức find của EntityManager tìm thực thể theo khoá chính: trước hết nó tra trong persistence context, nếu chưa có thì phát câu SELECT, rồi trả về đối tượng đã được quản lý hoặc null nếu không tồn tại; đây là thao tác đọc (Read) trong CRUD. "em.persist(entity); " đưa một thực thể mới vào trạng thái được quản lý để INSERT khi flush, tức thao tác tạo. "em.remove(entity); " đánh dấu thực thể đang được quản lý để xoá, sinh DELETE khi flush. "em.merge(entity);"chép trạng thái của một thực thể tách rời (detached) vào bản được quản lý và trả về bản đó, dùng để cập nhật chứ không phải đọc.

Mở trang câu hỏi này →
36Which class loads FXML files?4 lựa chọn
AFXMLLoader
BScene
CStage
DNode
Lời giải
Đáp án đúng: "FXMLLoader". FXMLLoader đọc tệp FXML (mô tả giao diện bằng XML), dựng cây node tương ứng, tạo đối tượng controller khai báo trong fx:controller, tiêm các trường đánh dấu @FXML rồi trả về nút gốc; cách gọi thường gặp là FXMLLoader.load với URL của tệp .fxml lấy từ getClass().getResource. "Scene" là vùng chứa toàn bộ nội dung của scene graph; nó nhận nút gốc đã được nạp chứ không tự đọc FXML. "Stage" là cửa sổ cấp cao nhất chứa Scene, chỉ lo hiển thị chứ không phân tích tệp. "Node" là lớp cơ sở của mọi thành phần trong scene graph như Button, Label, Pane; kết quả của việc nạp FXML là một Node nhưng bản thân Node không có khả năng nạp tệp giao diện.
Mở trang câu hỏi này →
37In JavaFX, consider:4 lựa chọncó code
Đề bài
Button btn = new Button("Click");
btn.setOnAction(e -> System.out.println("Pressed"));

What happens when user clicks the button?

ANothing
BCompilation error
CText 'Pressed' is printed in console
DButton disappears
Lời giải
Đáp án đúng: "Text 'Pressed' is printed in console". Lần theo mã: dòng đầu tạo Button có nhãn Click; dòng hai gọi setOnAction với một biểu thức lambda, đăng ký trình xử lý cho sự kiện ActionEvent. Khi người dùng bấm nút (giả sử nút đã nằm trong Scene đang hiển thị), JavaFX phát ActionEvent và gọi lambda trên luồng JavaFX Application Thread, lệnh System.out.println ghi chữ Pressed ra console, còn nút vẫn giữ nguyên trên giao diện. "Nothing" sai vì trình xử lý đã được gắn nên lần bấm có hiệu ứng. "Compilation error" sai vì lambda nhận tham số e và gọi println khớp đúng interface EventHandler cho ActionEvent, biên dịch bình thường. "Button disappears" sai vì không có dòng nào gọi setVisible(false) hay gỡ nút khỏi layout.
Mở trang câu hỏi này →
AReact.js
BAngular.js
CThymeleaf
DNode.js
Lời giải
Đáp án đúng: "Thymeleaf". Thymeleaf là template engine Java chạy phía máy chủ, tích hợp với Spring MVC qua ThymeleafViewResolver: controller trả tên view, Thymeleaf đọc tệp HTML có các thuộc tính như th:text, th:each, th:if rồi thay dữ liệu từ model vào để sinh trang hoàn chỉnh; ưu điểm là tệp mẫu vẫn là HTML hợp lệ, mở thẳng trên trình duyệt được (natural templating). "React.js" là thư viện giao diện JavaScript chạy phía trình duyệt, không phải template engine của Spring MVC; nó thường gọi REST API do Spring cung cấp. "Angular.js" là framework JavaScript phía client, cũng nằm ngoài cơ chế ViewResolver. "Node.js" là môi trường chạy JavaScript phía máy chủ, một nền tảng backend riêng chứ không phải công cụ dựng view trong ứng dụng Spring.
Mở trang câu hỏi này →
ADispatcherServlet → HandlerMapping → HandlerAdapter → Controller → ViewResolver
BViewResolver → Controller → DispatcherServlet
CController → View → Model → DispatcherServlet
DHandler → Controller → DispatcherServlet
Lời giải
Đáp án đúng: "DispatcherServlet → HandlerMapping → HandlerAdapter → Controller → ViewResolver". Yêu cầu tới DispatcherServlet trước tiên; DispatcherServlet hỏi HandlerMapping để tìm handler khớp URL, rồi nhờ HandlerAdapter (thường là RequestMappingHandlerAdapter) gọi phương thức controller với các tham số đã gắn; controller trả tên view và model, DispatcherServlet đưa tên view cho ViewResolver để lấy đối tượng View rồi dựng phản hồi. "ViewResolver → Controller → DispatcherServlet" đảo ngược hoàn toàn: ViewResolver chỉ có việc khi controller đã trả về tên view, không thể đứng đầu. "Controller → View → Model → DispatcherServlet" sai vì controller không nhận yêu cầu trực tiếp, model được chuẩn bị trước khi dựng view, và DispatcherServlet là điểm vào chứ không phải điểm cuối. "Handler → Controller → DispatcherServlet" sai vì bỏ qua HandlerMapping, HandlerAdapter, ViewResolver và lại đặt DispatcherServlet ở cuối, trong khi handler chính là controller được tìm thấy sau khi DispatcherServlet nhận yêu cầu.
Mở trang câu hỏi này →
AHandling UI rendering on the client
BActing as the front controller to dispatch requests to appropriate handlers
CEncrypting HTTP requests
DManaging database transactions
Lời giải
Đáp án đúng: "Acting as the front controller to dispatch requests to appropriate handlers". DispatcherServlet là front controller (bộ điều khiển trung tâm) của Spring MVC: mọi yêu cầu HTTP đi vào một điểm duy nhất này, nó hỏi HandlerMapping để tìm phương thức controller khớp đường dẫn và phương thức HTTP, gọi qua HandlerAdapter, nhận về tên view và model rồi nhờ ViewResolver render, hoặc ghi thẳng dữ liệu ra phản hồi với @ResponseBody, đồng thời xử lý exception qua HandlerExceptionResolver. "Handling UI rendering on the client" sai vì DispatcherServlet chạy trên máy chủ, còn render phía trình duyệt là việc của JavaScript; ngay cả render phía máy chủ nó cũng uỷ cho View. "Encrypting HTTP requests" là việc của TLS ở tầng kết nối HTTPS, do máy chủ web như Tomcat cấu hình. "Managing database transactions" thuộc @Transactional và transaction manager ở tầng service.
Mở trang câu hỏi này →