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 cuối kỳ 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
ASpring Initializr
BMaven Archetype
CGradle Plugin
DJDK installer
Lời giải
Đáp án đúng: "Spring Initializr". Spring Initializr là dịch vụ tạo khung dự án Spring Boot, dùng qua trang start.spring.io hoặc tích hợp sẵn trong IntelliJ IDEA, VS Code, Spring Tool Suite: chỉ cần chọn Maven hay Gradle, phiên bản Java, Spring Boot và các starter như Web, Data JPA, Thymeleaf là nhận ngay một dự án có sẵn lớp main, pom.xml hoặc build.gradle và application.properties. "Maven Archetype" là cơ chế mẫu dự án chung của Maven, dùng được cho mọi loại dự án Java nhưng không chọn starter Spring Boot nhanh như vậy. "Gradle Plugin" ở đây là plugin Spring Boot cho Gradle, dùng để chạy và đóng gói jar chạy được, chứ không sinh dự án mới. "JDK installer" chỉ cài bộ công cụ phát triển Java, là điều kiện cần nhưng không tạo dự án.
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 →
Ath:if
Bth:each
Cth:text
Dth:href
Lời giải
Đáp án đúng: "th:each". Thuộc tính th:each của Thymeleaf lặp qua một tập hợp như List, mảng hay Map và lặp lại phần tử HTML chứa nó cho mỗi phần tử, ví dụ đặt th:each với biểu thức s : ${students} trên thẻ tr sẽ sinh một dòng bảng cho mỗi sinh viên, kèm biến trạng thái cho chỉ số và số đếm. "th:if" chỉ hiển thị phần tử khi biểu thức đúng, là điều kiện chứ không phải vòng lặp. "th:text" thay nội dung văn bản của phần tử bằng giá trị biểu thức, có thoát ký tự HTML. "th:href" tính giá trị thuộc tính href, thường kèm cú pháp liên kết @{...} để dựng URL đúng context path. Muốn hiển thị danh sách thì dùng th:each bao ngoài, rồi th:text bên trong cho từng giá trị.
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 →
Đề 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 →
26Thymeleaf integrates well with:4 lựa chọn
AReact.js
BAngular.js
CSpring MVC.
DNode.js
Lời giải
Đáp án đúng: "Spring MVC.". Thymeleaf là template engine chạy phía máy chủ trên Java và có module tích hợp riêng thymeleaf-spring: ThymeleafViewResolver cắm vào luồng của DispatcherServlet, template đọc được dữ liệu trong Model, dùng biểu thức Spring EL, liên kết form với đối tượng qua th:object và th:field, hiển thị lỗi validation; Spring Boot còn tự cấu hình mọi thứ khi có spring-boot-starter-thymeleaf. "React.js" là thư viện JavaScript dựng giao diện phía trình duyệt, tự render bằng JavaScript nên không dùng template máy chủ của Java. "Angular.js" cũng là framework phía client có cú pháp template riêng chạy trong trình duyệt. "Node.js" là môi trường chạy JavaScript phía máy chủ, dùng các engine như EJS hay Pug, còn Thymeleaf là thư viện Java nên không chạy trên môi trường đó.
Mở trang câu hỏi này →
27Thymeleaf 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 →
A@ManyToOne
B@OneToOne
C@OneToMany
D@ManyToMany
Lời giải
Đáp án đúng: "@OneToMany". @OneToMany đặt trên một trường kiểu tập hợp, ví dụ danh sách các Order trong entity Customer, cho biết một khách hàng có nhiều đơn hàng; nó thường đi kèm mappedBy trỏ tới trường ở phía nhiều để quan hệ hai chiều dùng chung một cột khoá ngoại. "@ManyToOne" mô tả chiều ngược lại, đặt ở phía nhiều, chẳng hạn trường customer trong Order, nơi giữ cột khoá ngoại; nó là nửa kia của quan hệ chứ không khai báo một-nhiều nhìn từ phía một. "@OneToOne" dành cho quan hệ một-một như User và Profile, mỗi bên chỉ có tối đa một đối tượng tương ứng. "@ManyToMany" dành cho quan hệ nhiều-nhiều như Student và Course, cần một bảng nối ở giữa.
Mở trang câu hỏi này →
ASpring MVC
BHibernate
CJavaFX
DSwing
Lời giải
Đáp án đúng: "Hibernate". Hibernate là framework ORM (Object-Relational Mapping, ánh xạ đối tượng sang quan hệ) phổ biến nhất của Java: nó ánh xạ lớp Java sang bảng, tự sinh SQL cho thao tác thêm, sửa, xoá, truy vấn, quản lý persistence context và cache, đồng thời là nhà cung cấp JPA mặc định mà Spring Boot dùng khi thêm starter Data JPA. "Spring MVC" là framework web theo mẫu Model-View-Controller, xử lý yêu cầu HTTP qua DispatcherServlet chứ không ánh xạ đối tượng sang bảng. "JavaFX" là bộ công cụ xây dựng giao diện ứng dụng desktop. "Swing" cũng là thư viện giao diện desktop, ra đời trước JavaFX, không liên quan tới truy cập 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 →
ATo define a single named query
BTo define multiple named queries
CTo define a primary key
DTo define a foreign key
Lời giải
Đáp án đúng: "To define multiple named queries". Named query là câu JPQL được đặt tên, khai báo tĩnh trên lớp thực thể bằng @NamedQuery với name và query, rồi gọi qua em.createNamedQuery. Ở các bản JPA trước 2.2, @NamedQuery không lặp lại được trên cùng một lớp, nên @NamedQueries làm annotation chứa, nhận một mảng nhiều @NamedQuery; từ JPA 2.2 có thể lặp trực tiếp, nhưng @NamedQueries vẫn là cách gom nhiều truy vấn đặt tên. "To define a single named query" là việc của chính @NamedQuery. "To define a primary key" là việc của @Id hoặc @EmbeddedId. "To define a foreign key" thuộc về @JoinColumn trên quan hệ, hoặc @ForeignKey để đặt tên ràng buộc, không liên quan truy vấn đặt tên.
Mở trang câu hỏi này →
Đề bài
private Long id;
AIt creates a foreign key for the entity
BIt marks the field as a version column
CIt marks the field as the primary key with auto-increment strategy
DIt disables the persistence of the field
Lời giải
Đáp án đúng: "It marks the field as the primary key with auto-increment strategy". Lần theo mã: @Id đánh dấu trường id là khoá chính của entity, còn @GeneratedValue(strategy = GenerationType.IDENTITY) báo JPA không tự cấp giá trị mà để cột identity hay auto-increment của cơ sở dữ liệu sinh khi INSERT, sau đó provider đọc lại khoá vừa sinh và gán vào trường id kiểu Long. "It creates a foreign key for the entity" sai vì khoá ngoại khai báo bằng @ManyToOne hoặc @OneToOne kèm @JoinColumn, không phải @Id. "It marks the field as a version column" sai vì cột phiên bản cho khoá lạc quan (optimistic locking) dùng @Version. "It disables the persistence of the field" sai vì muốn một trường không được lưu xuống bảng thì dùng @Transient; ở đây trường id lại là trường quan trọng nhất được lư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.persist(entity);
Bem.remove(entity);
Cem.find(Entity.class, id);
Dem.merge(entity);
Lời giải

Đáp án đúng: "em.merge(entity); ". Cập nhật một entity trong ứng dụng JavaFX thường diễn ra khi đối tượng đã được nạp từ trước, hiển thị trên form, người dùng sửa rồi bấm lưu; lúc đó entity đã ở trạng thái detached (tách khỏi persistence context) vì EntityManager cũ đã đóng, nên phải gọi merge trong một giao dịch: JPA chép trạng thái của nó vào bản managed có cùng khoá chính và khi commit sẽ sinh câu UPDATE. Chú ý merge trả về bản managed, còn đối tượng truyền vào vẫn detached. "em.persist(entity); " dùng cho entity mới, sinh INSERT và báo lỗi khi gặp entity detached. "em.remove(entity); " xoá entity, sinh DELETE. "em.find(Entity.class, id);"chỉ nạp entity theo khoá chính, là bước đọc chứ không ghi thay đổi; tuy entity vừa find rồi sửa trong cùng giao dịch cũng được cập nhật nhờ dirty checking, bản thân lệnh đó không thực hiện việc cập nhật.

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 →
AHBox/VBox
BBorderPane
CGridPane
DStackPane
Lời giải
Đáp án đúng: "GridPane". GridPane xếp các Node theo lưới hàng và cột, mỗi phần tử đặt bằng add(node, cột, hàng), nên trong form CRUD có thể đặt nhãn ở cột trái, ô nhập ở cột phải, mọi hàng thẳng cột với nhau và hàng nút ở dưới cùng; đó là bố cục điển hình cho form nhập liệu. "HBox/VBox" là chỗ có thể tranh cãi: lồng VBox chứa nhiều HBox cũng dựng được một form đơn giản, nhưng mỗi HBox tính độ rộng riêng nên nhãn và ô nhập không tự thẳng hàng giữa các dòng, phải chỉnh tay, vì thế với form nhiều trường GridPane vẫn là lựa chọn tiêu biểu. "BorderPane" chia vùng thành top, bottom, left, right, center, hợp cho khung tổng thể của cửa sổ, và form thường được đặt vào vùng center của nó. "StackPane" xếp chồng các Node lên nhau, hợp cho lớp phủ hay căn giữa một phần tử, không hợp để xếp nhiều trường nhập.
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 →
AEntityManager
BJdbcTemplate
CSessionFactory
DRepository
Lời giải
Đáp án đúng: "JdbcTemplate". Trong Spring JDBC, JdbcTemplate là lớp chạy câu SQL: query với RowMapper để đọc nhiều dòng, queryForObject để lấy một giá trị, update để thêm, sửa, xoá; nó lo mở, đóng kết nối và dịch SQLException thành DataAccessException. "EntityManager" là API của JPA, làm việc với thực thể và JPQL chứ không phải công cụ của Spring JDBC. "SessionFactory" là của Hibernate gốc, tạo Session để thao tác ORM, cũng không thuộc Spring JDBC. "Repository" là khái niệm tầng truy cập dữ liệu, ứng với annotation @Repository hoặc interface của Spring Data; bên trong một repository có thể dùng JdbcTemplate, nhưng bản thân Repository không phải lớp thực thi SQL.
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 →