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ố 1

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
ATo define a database entity.
BTo enable Spring MVC functionality.
CTo combine @Configuration, @EnableAutoConfiguration, and @ComponentScan.
DTo define a RESTful endpoint.
Lời giải
Đáp án đúng: "To combine @Configuration, @EnableAutoConfiguration, and @ComponentScan.". @SpringBootApplication là meta-annotation (annotation gộp) gồm @SpringBootConfiguration, một dạng @Configuration cho phép khai báo @Bean, cùng @EnableAutoConfiguration tự cấu hình bean dựa trên thư viện có trên classpath và thuộc tính, và @ComponentScan quét gói chứa lớp main cùng các gói con để tìm @Component, @Service, @Controller; đặt nó lên lớp chứa main rồi gọi SpringApplication.run là đủ khởi động ứng dụng. "To define a database entity." sai vì entity khai báo bằng @Entity. "To enable Spring MVC functionality." chỉ đúng gián tiếp: Spring MVC được auto-configuration bật khi có spring-boot-starter-web, còn bản thân annotation không dành riêng cho MVC. "To define a RESTful endpoint." sai vì endpoint REST khai báo bằng @RestController kèm @GetMapping hay @PostMapping.
Mở trang câu hỏi này →
Đề bài
<a th:href="______">Home</a>
A${/home}
B#{/home}
C@{/home}
D~{/home}
Lời giải
Đáp án đúng: "@{/home}". Trong cú pháp biểu thức chuẩn của Thymeleaf, @{...} là biểu thức URL liên kết (link URL expression): với đường dẫn bắt đầu bằng dấu gạch chéo, Thymeleaf tự thêm context path của ứng dụng, cho phép truyền tham số như @{/home(id=${id})} và mã hoá URL, nên th:href="@{/home}" sinh ra liên kết đúng dù ứng dụng chạy ở đường dẫn gốc nào. "${/home}" là biểu thức biến, dùng để đọc thuộc tính trong model, còn /home không phải tên biến hợp lệ. "#{/home}" là biểu thức thông điệp, dùng để tra khoá trong tệp messages cho đa ngôn ngữ. "~{/home}" là biểu thức fragment, dùng với th:insert hoặc th:replace để chèn một mảnh template, không tạo đường dẫn liên kết.
Mở trang câu hỏi này →
Ath:if
Bth:each
Cth:text
Dth:href
Lời giải

Đáp án đúng: "th:if". th:if đánh giá một biểu thức, ví dụ th:

Lời giải
if="${user.admin}";

nếu kết quả là true, Thymeleaf giữ lại thẻ cùng toàn bộ nội dung bên trong khi render, nếu false thì thẻ bị loại khỏi HTML đầu ra; th:unless làm điều ngược lại. Đây là cách hiển thị có điều kiện, như chỉ hiện nút xoá cho quản trị viên. "th:each" là thuộc tính lặp, nhân bản thẻ cho từng phần tử của một tập hợp, ví dụ mỗi sản phẩm một dòng bảng. "th:text" thay nội dung chữ của thẻ bằng giá trị biểu thức, có escape HTML. "th:href" tạo giá trị thuộc tính href cho liên kết, thường dùng cú pháp @{...} để sinh URL có context path. Không thuộc tính nào trong số đó quyết định việc thẻ có xuất hiện hay không.

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 →
AXML templates
BText templates
CJSON templates
DBinary templates
Lời giải
Đáp án đúng gồm hai ý: "XML templates" và "Text templates". Thymeleaf xử lý sáu chế độ template (template mode): HTML, XML, TEXT, JAVASCRIPT, CSS và RAW; trong đó XML là chế độ đánh dấu (markup) dành cho tài liệu XML hợp lệ, còn TEXT là chế độ văn bản thuần dùng cú pháp biểu thức nội tuyến để sinh email chữ, tệp cấu hình hay văn bản bất kỳ không có thẻ. "JSON templates" sai vì Thymeleaf không có chế độ JSON riêng; muốn sinh JSON thì dùng chế độ TEXT hoặc JAVASCRIPT, còn trong ứng dụng Spring thường để Jackson tuần tự hoá đối tượng. "Binary templates" sai vì Thymeleaf là template engine cho dữ liệu dạng văn bản, không xử lý tệp nhị phân như ảnh hay PDF.
Mở trang câu hỏi này →
A@RestController
B@Service
C@Entity
D@Bean
Lời giải
Đáp án đúng: "@RestController". @RestController là annotation tổng hợp gồm @Controller và @ResponseBody: lớp vẫn là handler web được Spring MVC quét, nhưng giá trị trả về của mọi phương thức được ghi thẳng vào thân phản hồi HTTP thông qua HttpMessageConverter, thường chuyển đối tượng Java thành JSON bằng Jackson, thay vì bị hiểu là tên view. Đây là cách viết REST API chuẩn trong Spring. "@Service" đánh dấu bean tầng nghiệp vụ, không nhận yêu cầu HTTP. "@Entity" là annotation JPA đánh dấu lớp ánh xạ tới bảng cơ sở dữ liệu. "@Bean" đặt trên phương thức trong lớp @Configuration để khai báo rằng đối tượng trả về được đăng ký làm bean, không liên quan tới việc xử lý yêu cầu REST.
Mở trang câu hỏi này →
ATo define a standard for web application development
BTo define a standard for object-relational mapping in Java
CTo manage user interfaces
DTo handle network communication
Lời giải
Đáp án đúng: "To define a standard for object-relational mapping in Java". Mục đích chính của JPA (Java Persistence API) là đưa ra một chuẩn chung cho ORM, tức ánh xạ đối tượng Java sang bảng quan hệ: đặc tả quy định annotation như @Entity, @Table, @Id, giao diện EntityManager, vòng đời thực thể và ngôn ngữ truy vấn JPQL, còn các nhà cung cấp như Hibernate hay EclipseLink hiện thực chuẩn đó, nên mã viết theo JPA có thể đổi nhà cung cấp mà ít phải sửa. "To define a standard for web application development" là phạm vi của Servlet, Jakarta EE web hay Spring MVC, không phải JPA. "To manage user interfaces" là việc của JavaFX, Swing hay tầng view. "To handle network communication" thuộc về socket, HTTP client hay RMI, không liên quan tới lưu trữ dữ liệu.
Mở trang câu hỏi này →
A@Entity
B@Table
C@Id
D@JoinColumn
Lời giải
Đáp án đúng: "@Id". @Id đánh dấu trường làm khoá chính của entity, tương ứng cột primary key trong bảng; JPA dùng giá trị này để định danh entity trong persistence context, cho em.find tra cứu, và thường đi kèm @GeneratedValue để cơ sở dữ liệu hoặc provider sinh giá trị, ví dụ chiến lược IDENTITY hay SEQUENCE. Mỗi entity bắt buộc có khoá chính. "@Entity" đánh dấu cả lớp là một entity được JPA quản lý, không chỉ định trường nào là khoá. "@Table" đặt tên bảng, schema hay ràng buộc unique cho entity, ở cấp lớp. "@JoinColumn" chỉ định cột khoá ngoại trong một quan hệ như @ManyToOne, tức trỏ tới khoá chính của bảng khác chứ không khai báo khoá chính của bảng mình.
Mở trang câu hỏi này →
29What does ORM stand for in JPA?4 lựa chọn
AObject Relational Mapping
BOpen Resource Management
COptimized Runtime Module
DOperational Reference Model
Lời giải
Đáp án đúng: "Object Relational Mapping". ORM nghĩa là ánh xạ đối tượng sang quan hệ: kỹ thuật nối mô hình hướng đối tượng của Java (lớp, thuộc tính, tham chiếu) với mô hình quan hệ của cơ sở dữ liệu (bảng, cột, khoá ngoại), để lớp thực thể tương ứng với bảng và mỗi đối tượng tương ứng với một dòng. JPA là đặc tả ORM chuẩn của Java, còn Hibernate là một hiện thực của nó. "Open Resource Management" không phải thuật ngữ của JPA, tên này nghe như quản lý tài nguyên chung. "Optimized Runtime Module" cũng là cụm đặt ra, không gắn với ánh xạ dữ liệu. "Operational Reference Model" không phải nghĩa của ORM trong ngữ cảnh JPA, cụm này không liên quan đối tượng hay bảng.
Mở trang câu hỏi này →
ATo handle user authentication
BTo ensure data integrity and consistency
CTo manage network traffic
DTo optimize web page loading
Lời giải
Đáp án đúng: "To ensure data integrity and consistency". Giao dịch (transaction) gom nhiều thao tác ghi thành một đơn vị theo tính chất ACID: hoặc tất cả được commit, hoặc khi có lỗi thì rollback toàn bộ, nên dữ liệu không bị bỏ dở nửa chừng; ví dụ chuyển tiền phải trừ tài khoản này và cộng tài khoản kia cùng lúc. Trong JPA, các thay đổi entity được flush xuống cơ sở dữ liệu trong phạm vi giao dịch, và Spring quản lý phạm vi đó bằng @Transactional. "To handle user authentication" sai vì xác thực người dùng là việc của Spring Security. "To manage network traffic" sai vì giao dịch cơ sở dữ liệu không điều phối lưu lượng mạng. "To optimize web page loading" sai vì tốc độ tải trang phụ thuộc bộ nhớ đệm và kích thước tài nguyên, không phải mục đích của quản lý giao dịch.
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 →
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 →
34In 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 →
ALabel
BTextField
CTableView
DButton
Lời giải
Đáp án đúng: "TableView". TableView là control của JavaFX hiển thị danh sách đối tượng dạng bảng: mỗi cột là một TableColumn gắn cellValueFactory, thường là PropertyValueFactory hoặc lambda trỏ tới thuộc tính của đối tượng, còn dữ liệu là một ObservableList nên khi danh sách thay đổi bảng tự cập nhật; nó hỗ trợ sắp xếp theo cột, chọn dòng và sửa ô, rất hợp để hiện kết quả truy vấn JPA. "Label" chỉ hiển thị một đoạn chữ hoặc biểu tượng tĩnh. "TextField" là ô nhập một dòng văn bản để người dùng gõ dữ liệu. "Button" là nút bấm phát sinh sự kiện ActionEvent khi được nhấn. Không control nào trong số này có cấu trúc hàng và cột để trình bày dữ liệu dạng bảng.
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 →
AIn the View layer.
BIn the Controller or Service layer.
CDirectly in the Entity class.
DInside the JavaFX Application class.
Lời giải
Đáp án đúng: "In the Controller or Service layer.". EntityManager là giao diện JPA thao tác với persistence context (ngữ cảnh lưu trữ), được tạo từ EntityManagerFactory; trong ứng dụng JavaFX không có Spring quản lý, nó thường được tạo và đóng ở tầng xử lý phía sau giao diện, mỗi thao tác hoặc mỗi giao dịch một EntityManager. Nói chặt chẽ thì thiết kế chuẩn đặt EntityManager ở tầng service hoặc DAO, còn controller JavaFX chỉ nên gọi service, nên việc gộp cả Controller vào đây hơi lỏng; dù vậy đây vẫn là lựa chọn duy nhất chỉ đúng vùng xử lý nghiệp vụ. "In the View layer." sai vì tầng giao diện chỉ hiển thị, đưa truy cập dữ liệu vào đó phá vỡ việc tách lớp. "Directly in the Entity class." sai vì entity là đối tượng được EntityManager quản lý, để nó tự giữ EntityManager là đảo ngược quan hệ. "Inside the JavaFX Application class." sai vì lớp Application lo vòng đời cửa sổ, đặt EntityManager ở đó là trộn giao diện với truy cập dữ liệu.
Mở trang câu hỏi này →
ATo define user interfaces.
BTo represent domain objects and data.
CTo manage HTTP requests.
DTo handle application deployment.
Lời giải
Đáp án đúng: "To represent domain objects and data.". Dù hiểu Model theo nghĩa thành phần M trong mẫu MVC, tức các đối tượng miền như Product, Order mang dữ liệu và quy tắc nghiệp vụ, hay theo nghĩa interface Model của Spring MVC, nơi controller gọi model.addAttribute để chuyển dữ liệu sang view, thì Model đều là nơi chứa và mang dữ liệu. "To define user interfaces." sai vì giao diện là phần View, như template Thymeleaf, chỉ đọc dữ liệu từ model để hiển thị. "To manage HTTP requests." sai vì nhận và xử lý yêu cầu HTTP là việc của DispatcherServlet và Controller. "To handle application deployment." sai vì triển khai ứng dụng là việc đóng gói và cấu hình máy chủ, không thuộc thành phần nào của MVC.
Mở trang câu hỏi này →
ASimplifies error handling
BAutomatic query optimization
CUI rendering
DThread pool creation
Lời giải
Đáp án đúng: "Simplifies error handling". JdbcTemplate của Spring gánh phần lặp lại của JDBC thuần: mở và đóng Connection, Statement, ResultSet đúng cách, và quan trọng là bắt SQLException kiểu checked rồi dịch sang cây ngoại lệ DataAccessException kiểu unchecked, có nghĩa rõ như DuplicateKeyException hay EmptyResultDataAccessException, nhờ vậy mã không còn đầy khối try-catch-finally. "Automatic query optimization" sai vì JdbcTemplate chạy nguyên câu SQL lập trình viên viết, việc tối ưu kế hoạch thực thi là của hệ quản trị cơ sở dữ liệu. "UI rendering" thuộc tầng giao diện như Thymeleaf, không liên quan tới JDBC. "Thread pool creation" là việc của ExecutorService hay ThreadPoolTaskExecutor, JdbcTemplate không tạo luồng; nhóm kết nối cũng do DataSource như HikariCP lo.
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 →