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 3/3 — câu 41–50.
Danh sách câu hỏi
50/50 câuHết danh sách
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
Mở trang câu hỏi này →Đá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.
42Which Spring annotation manages transactions?4 lựa chọn
A@Autowired
B@Transactional
C@Service
D@Entity
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "@Transactional". @Transactional đặt trên lớp hoặc phương thức để Spring bọc lời gọi trong một giao dịch: proxy AOP mở giao dịch qua PlatformTransactionManager trước khi chạy phương thức, commit nếu kết thúc bình thường và rollback nếu ném RuntimeException hay Error; có thể chỉnh propagation, isolation, readOnly, timeout, rollbackFor. Lưu ý lời gọi từ chính bên trong cùng lớp không đi qua proxy nên không được áp giao dịch. "@Autowired" chỉ tiêm phụ thuộc vào bean. "@Service" đánh dấu bean tầng nghiệp vụ; tầng này thường là nơi đặt @Transactional nhưng bản thân annotation đó không mở giao dịch nào. "@Entity" đánh dấu lớp được JPA ánh xạ tới bảng, mô tả dữ liệu chứ không điều khiển giao dịch.
ATo manage database connections.
BTo handle HTTP requests and return a model and view.
CTo define user interfaces.
DTo configure application security.
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "To handle HTTP requests and return a model and view.". Trong Spring MVC, DispatcherServlet chuyển yêu cầu tới phương thức handler của controller (lớp @Controller với @GetMapping, @PostMapping); controller đọc tham số, gọi service, đặt dữ liệu vào Model rồi trả về tên view hoặc đối tượng ModelAndView để ViewResolver phân giải thành trang, ví dụ trang Thymeleaf. "To manage database connections." sai vì kết nối do DataSource và connection pool lo, còn truy cập dữ liệu nằm ở repository. "To define user interfaces." sai vì giao diện do view template định nghĩa, controller chỉ chọn view và cấp dữ liệu. "To configure application security." là việc của Spring Security qua SecurityFilterChain, chạy ở tầng filter trước khi yêu cầu tới controller.
A@Component
B@Service
C@Entity
D@Repository
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "@Entity". @Entity đánh dấu một lớp là thực thể JPA, tức lớp được ánh xạ tới một bảng; provider như Hibernate sẽ quản lý vòng đời các đối tượng thuộc lớp đó trong persistence context, và Spring Data JPA chỉ tạo repository cho các lớp đã là entity. "@Component" là stereotype chung đăng ký một lớp làm bean trong Spring container, không liên quan tới ánh xạ bảng. "@Service" là dạng chuyên biệt của @Component cho tầng nghiệp vụ, chỉ mang ý nghĩa vai trò. "@Repository" đánh dấu bean truy cập dữ liệu và bật dịch ngoại lệ sang DataAccessException; nó gắn lên lớp hoặc interface truy cập dữ liệu chứ không gắn lên lớp dữ liệu, và với interface kế thừa JpaRepository thì thậm chí không bắt buộc.
A@Query
B@NamedQuery
C@StoredProcedure
D@NativeQuery
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "@NamedQuery". Theo JPA, @NamedQuery đặt trên lớp thực thể khai báo một câu JPQL tĩnh có tên qua hai thuộc tính name và query, ví dụ tên Student.findByName; truy vấn được kiểm tra khi khởi động và gọi lại bằng em.createNamedQuery hoặc qua phương thức repository trùng tên. "@Query" là annotation của Spring Data, gắn câu JPQL hoặc SQL trực tiếp lên một phương thức repository; nó có truy vấn nhưng không định nghĩa named query, vì truy vấn đó không có tên dùng chung và chỉ thuộc về đúng phương thức ấy. "@StoredProcedure" không phải annotation của JPA; thủ tục lưu sẵn được khai báo bằng @NamedStoredProcedureQuery. "@NativeQuery" không phải cách định nghĩa named query trong JPA; Spring Data bản mới có annotation này nhưng chỉ là dạng tắt của @Query cho SQL thuần, còn truy vấn SQL thuần có tên dùng @NamedNativeQuery.
AA single monolithic library that replaces JPA
BAn umbrella project containing multiple modules for different data stores and data-access styles
CA JDBC driver for all relational databases
DA GUI client for managing databases
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "An umbrella project containing multiple modules for different data stores and data-access styles". Spring Data là dự án ô (umbrella project) gồm nhiều mô-đun có chung mô hình lập trình repository: Spring Data JPA, Spring Data JDBC, Spring Data MongoDB, Spring Data Redis, Spring Data Elasticsearch và nhiều mô-đun khác, mỗi cái dành cho một kiểu kho dữ liệu, cả quan hệ lẫn NoSQL, đồng bộ hay reactive, nhưng đều cung cấp interface repository, suy truy vấn từ tên phương thức và phân trang. "A single monolithic library that replaces JPA" sai hai chỗ: Spring Data không phải một thư viện đơn khối, và Spring Data JPA chạy trên JPA chứ không thay JPA, vẫn cần Hibernate làm provider. "A JDBC driver for all relational databases" sai vì driver JDBC do từng nhà cung cấp cơ sở dữ liệu phát hành. "A GUI client for managing databases" sai vì Spring Data là thư viện cho mã nguồn, không phải công cụ đồ hoạ như pgAdmin hay MySQL Workbench.
47What best describes Spring Data JPA?4 lựa chọn
AA NoSQL database engine
BA higher-level abstraction on top of JPA that simplifies repository-based data access
CA replacement for the Spring Framework core container
DA message broker for JMS-based applications
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "A higher-level abstraction on top of JPA that simplifies repository-based data access". Spring Data JPA nằm trên JPA và provider như Hibernate: ta chỉ khai báo interface kế thừa JpaRepository, Spring tự sinh cài đặt lúc chạy với sẵn save, findById, findAll, phân trang, sắp xếp, và suy truy vấn từ tên phương thức hoặc @Query, nên không phải tự viết mã EntityManager lặp lại. "A NoSQL database engine" sai vì nó không phải cơ sở dữ liệu mà là thư viện truy cập dữ liệu, làm việc với cơ sở dữ liệu quan hệ qua JPA (kho NoSQL có các mô-đun Spring Data khác như Spring Data MongoDB). "A replacement for the Spring Framework core container" sai vì nó dựa vào chính IoC container để đăng ký repository làm bean chứ không thay thế container. "A message broker for JMS-based applications" sai vì môi giới thông điệp là việc của ActiveMQ hay RabbitMQ, không liên quan tới truy cập dữ liệu.
AJPQL
BSQL-92 only
CHQL only
DNative database-specific SQL
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "JPQL". Trong Spring Data JPA, chuỗi trong @Query mặc định được hiểu là JPQL (Java Persistence Query Language), ngôn ngữ truy vấn hướng đối tượng của JPA viết theo tên thực thể và tên trường, ví dụ select u from User u where u.email = :email, rồi nhà cung cấp JPA dịch sang SQL của cơ sở dữ liệu đang dùng. "Native database-specific SQL" chỉ được dùng khi khai báo tường minh nativeQuery = true, lúc đó câu lệnh viết theo tên bảng và cột thật. "HQL only" sai vì HQL là ngôn ngữ riêng của Hibernate; Hibernate chấp nhận JPQL như một tập con của HQL, nhưng @Query được định nghĩa theo JPQL để không phụ thuộc nhà cung cấp. "SQL-92 only" sai vì @Query mặc định không nhận SQL thuần theo chuẩn nào cả.
ATo manage user sessions.
BTo ensure data consistency by grouping database operations into a single unit.
CTo handle file uploads.
DTo create REST endpoints.
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "To ensure data consistency by grouping database operations into a single unit.". @Transactional gom các thao tác cơ sở dữ liệu trong một phương thức thành một giao dịch nguyên tử: hoặc tất cả cùng được commit, hoặc khi có RuntimeException thì tất cả bị rollback, ví dụ chuyển tiền gồm trừ tài khoản này và cộng tài khoản kia không thể chỉ xong một nửa. Trong Spring Data JPA, các phương thức của SimpleJpaRepository đã mặc định có @Transactional, phương thức đọc ở chế độ readOnly, còn ở tầng service ta tự đặt để nhiều lời gọi repository chung một giao dịch và một persistence context. "To manage user sessions." là việc của HttpSession hay Spring Session, không liên quan tới giao dịch cơ sở dữ liệu. "To handle file uploads." do MultipartFile và MultipartResolver xử lý. "To create REST endpoints." là vai trò của @RestController kèm @GetMapping, @PostMapping.
50You have a controller:
@RestController4 lựa chọncó code
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
Mở trang câu hỏi này →Đá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.