HSF302Chưa đoKỳ 5Tự chọn Cập nhật 1 ngày 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ủ đề

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

124/179 câuCòn 55
ATo provide a database management system.
BTo offer a comprehensive infrastructure support for developing Java applications.
CTo create graphical user interfaces.
DTo manage operating system resources.
Lời giải
Đáp án đúng: "To offer a comprehensive infrastructure support for developing Java applications.". Spring Framework là nền tảng cung cấp hạ tầng toàn diện cho ứng dụng Java: lõi IoC container và Dependency Injection, AOP, quản lý giao dịch, truy cập dữ liệu, Spring MVC cho web, hỗ trợ kiểm thử; nhờ vậy lập trình viên tập trung vào logic nghiệp vụ còn phần hạ tầng lặp lại do framework lo. "To provide a database management system." sai vì Spring không phải hệ quản trị cơ sở dữ liệu, nó chỉ kết nối tới MySQL, PostgreSQL qua JDBC hay JPA. "To create graphical user interfaces." là việc của JavaFX hay Swing; Spring có thể đứng sau một ứng dụng giao diện nhưng không phải bộ công cụ vẽ giao diện. "To manage operating system resources." là việc của hệ điều hành, Spring chạy trên JVM và không quản lý tài nguyên hệ điều hành.
Mở trang câu hỏi này →
ATo define database connections.
BTo map HTTP requests to specific controller methods.
CTo define user interfaces.
DTo configure application security.
Lời giải
Đáp án đúng: "To map HTTP requests to specific controller methods.". @RequestMapping khai báo URL, phương thức HTTP, tham số, header hay kiểu nội dung mà một lớp hoặc phương thức controller xử lý; khi khởi động, RequestMappingHandlerMapping quét các annotation này để lập bảng ánh xạ, và lúc chạy DispatcherServlet dùng bảng đó để chọn đúng phương thức. Các annotation @GetMapping, @PostMapping chỉ là dạng rút gọn của nó. "To define database connections." sai vì kết nối cơ sở dữ liệu cấu hình qua DataSource và các thuộc tính spring.datasource. "To define user interfaces." sai vì giao diện nằm ở template như Thymeleaf, còn annotation này chỉ định tuyến yêu cầu. "To configure application security." sai vì phân quyền theo URL được cấu hình trong SecurityFilterChain của Spring Security; @RequestMapping không kiểm tra ai được truy cập.
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 →
AMaps POST requests
BMaps GET requests to /list
CDenotes a view name
DDisables route
Lời giải
Đáp án đúng: "Maps GET requests to /list". @GetMapping là dạng rút gọn của @RequestMapping(method = RequestMethod.GET); đặt @GetMapping("/list") lên một phương thức trong controller nghĩa là DispatcherServlet sẽ chuyển mọi yêu cầu HTTP GET tới đường dẫn /list (cộng với tiền tố @RequestMapping ở cấp lớp nếu có) cho phương thức đó xử lý, thường để hiển thị danh sách. "Maps POST requests" là vai trò của @PostMapping, dùng khi gửi form hay tạo mới dữ liệu. "Denotes a view name" sai vì chuỗi /list là đường dẫn URL; tên view là giá trị phương thức trả về, chẳng hạn chuỗi product-list để ViewResolver tìm template. "Disables route" sai vì annotation này đăng ký thêm một route chứ không tắt route nào; Spring không có annotation mapping dùng để vô hiệu hoá đường dẫn.
Mở trang câu hỏi này →
A@ExceptionHandler methods handle exceptions across all controllers by default; @ControllerAdvice limits them to one controller
B@ExceptionHandler only works with REST controllers; @ControllerAdvice only with MVC controllers
C@ExceptionHandler in a controller handles exceptions for that controller; @ControllerAdvice can apply such handlers globally
DBoth are deprecated in favor of filters
Lời giải

Đáp án đúng: "@ExceptionHandler in a controller handles exceptions for that controller; @ControllerAdvice can apply such handlers globally". Phương thức @ExceptionHandler khai báo trong một controller chỉ bắt ngoại lệ ném ra từ các handler của chính controller đó; muốn dùng chung cho nhiều controller, ta đặt các phương thức @ExceptionHandler vào một lớp @ControllerAdvice hoặc @RestControllerAdvice, và mặc định lớp này áp cho mọi controller, có thể thu hẹp bằng basePackages hay assignableTypes. Phát biểu "handle exceptions across all controllers by default; @ControllerAdvice limits them to one controller" nói ngược hoàn toàn vai trò của hai annotation. Phát biểu "only works with REST controllers; @ControllerAdvice only with MVC controllers" sai vì cả hai dùng được cho controller trả view lẫn controller REST. "Both are deprecated in favor of filters" sai vì cả hai vẫn là cơ chế chính thức trong Spring hiện nay; filter chạy trước DispatcherServlet nên không thay được việc xử lý ngoại lệ ở tầng handler.

Mở trang câu hỏi này →
ATo generate UUIDs.
BTo generate primary keys using a sequence.
CTo generate primary keys using an auto-increment column.
DTo generate random numbers.
Lời giải
Đáp án đúng: "To generate primary keys using an auto-increment column.". GenerationType.IDENTITY giao việc sinh khoá chính cho cột identity hoặc auto-increment của cơ sở dữ liệu (AUTO_INCREMENT ở MySQL, IDENTITY ở SQL Server); provider phải chạy INSERT ngay để lấy khoá vừa sinh, nên Hibernate không gom lô các lệnh chèn được với chiến lược này. "To generate UUIDs." sai vì khoá UUID dùng GenerationType.UUID (có từ JPA 3.1) hoặc bộ sinh UUID riêng của Hibernate. "To generate primary keys using a sequence." mô tả GenerationType.SEQUENCE, dùng đối tượng sequence của cơ sở dữ liệu kèm @SequenceGenerator và cấp số trước khi INSERT. "To generate random numbers." sai vì không chiến lược sinh khoá nào của JPA tạo số ngẫu nhiên; IDENTITY tăng dần tuần tự.
Mở trang câu hỏi này →
AA command-line tool to compile and run Groovy scripts, supporting rapid prototyping
BA tool that provisions cloud resources on AWS only
CA dedicated debugger for Spring MVC controllers
DA SQL client bundled with Spring Boot
Lời giải
Đáp án đúng: "A command-line tool to compile and run Groovy scripts, supporting rapid prototyping". Spring Boot CLI là công cụ dòng lệnh cho phép viết một tệp Groovy ngắn chứa controller rồi chạy ngay bằng lệnh spring run, CLI tự suy và kéo các dependency cần thiết, tự thêm import, nên rất hợp để thử nghiệm nhanh mà không cần dựng dự án Maven hay Gradle đầy đủ; ở các bản Spring Boot 3 về sau, CLI tập trung vào việc khởi tạo dự án như spring init, nhưng mô tả kinh điển của nó vẫn là chạy script Groovy để tạo mẫu nhanh. "A tool that provisions cloud resources on AWS only" sai vì việc cấp phát hạ tầng đám mây là của các công cụ như AWS CLI hay Terraform, Spring Boot CLI không làm việc đó. "A dedicated debugger for Spring MVC controllers" sai vì CLI không phải trình gỡ lỗi, việc này do IDE và JVM debugger đảm nhận. "A SQL client bundled with Spring Boot" sai vì Spring Boot không kèm công cụ khách SQL nào, CLI cũng không kết nối cơ sở dữ liệu để chạy lệnh SQL.
Mở trang câu hỏi này →
A@OneToOne
B@ManyToOne
C@OneToMany
D@ManyToMany
Lời giải
Đáp án đúng: "@ManyToMany". @ManyToMany trong JPA khai báo quan hệ nhiều nhiều, ví dụ một Student học nhiều Course và một Course có nhiều Student; phía sở hữu thường kèm @JoinTable mô tả bảng nối, phía còn lại dùng mappedBy trỏ về trường của phía sở hữu, và kiểu trường là một tập hợp như Set hoặc List. "@OneToOne" dành cho quan hệ một một, mỗi entity bên này ứng với đúng một entity bên kia. "@ManyToOne" đặt ở phía nhiều của quan hệ một nhiều, trường là một đối tượng đơn và cột khoá ngoại nằm trong bảng của chính entity đó. "@OneToMany" đặt ở phía một, trường là tập hợp nhưng mỗi phần tử con chỉ thuộc về một cha, nên không diễn tả được việc hai bên cùng có nhiều.
Mở trang câu hỏi này →
ATo specify a primary key
BTo mark a field as not persistent (not to be stored in the database)
CTo define a relationship between entities
DTo indicate a read-only field
Lời giải
Đáp án đúng: "To mark a field as not persistent (not to be stored in the database)". Theo JPA, mọi trường của thực thể mặc định đều được ánh xạ thành cột; đặt @Transient lên một trường báo persistence provider bỏ qua nó, không tạo cột, không đọc ghi, thường dùng cho giá trị tính toán như tuổi suy ra từ ngày sinh hay trường tạm chỉ dùng trong bộ nhớ. Cần phân biệt với từ khoá transient của Java vốn chủ yếu liên quan tuần tự hoá. "To specify a primary key" là việc của @Id. "To define a relationship between entities" là việc của @OneToMany, @ManyToOne, @ManyToMany hay @OneToOne. "To indicate a read-only field" sai vì trường @Transient hoàn toàn không gắn với cơ sở dữ liệu; muốn cột chỉ đọc thì dùng @Column với insertable và updatable bằng false, hoặc @Immutable của Hibernate cho cả thực thể.
Mở trang câu hỏi này →
A@Component
B@Service
C@Entity
D@Repository
Lời giải
Đá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.
Mở trang câu hỏi này →
ARobust transaction management.
BComprehensive web development support through Spring MVC.
CAutomatic generation of user interfaces.
DStrong community support and extensive documentation.
Lời giải
Đáp án đúng: "Automatic generation of user interfaces.". Câu hỏi tìm điều KHÔNG phải ưu điểm chung của Spring, và Spring không hề tự sinh giao diện người dùng: lập trình viên vẫn phải tự viết template Thymeleaf, JSP hoặc front-end riêng, Spring chỉ cung cấp hạ tầng để nối dữ liệu vào view. "Robust transaction management." là ưu điểm thật, vì @Transactional và PlatformTransactionManager cho phép quản lý giao dịch khai báo, thống nhất cho JDBC, JPA hay JTA, nên không được chọn. "Comprehensive web development support through Spring MVC." cũng đúng, Spring MVC cung cấp DispatcherServlet, controller, data binding, validation và REST. "Strong community support and extensive documentation." đúng nốt, Spring có cộng đồng rất lớn và tài liệu tham khảo chính thức đầy đủ, nên cũng không phải đáp án.
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 →
A@Aspect
B@Controller
C@Repository
D@Configuration
Lời giải
Đáp án đúng: "@Aspect". Trong Spring AOP (lập trình hướng khía cạnh), @Aspect lấy từ AspectJ đánh dấu một lớp là aspect, tức mô-đun gom logic cắt ngang như ghi log, đo thời gian; bên trong khai báo pointcut bằng @Pointcut và advice bằng @Before, @After, @Around. Lớp này phải đồng thời là bean (thêm @Component) và cần bật hỗ trợ bằng @EnableAspectJAutoProxy, hoặc được Spring Boot bật tự động, khi đó Spring tạo proxy bọc các bean khớp pointcut. "@Controller" đánh dấu lớp xử lý yêu cầu web trong Spring MVC. "@Repository" đánh dấu lớp truy cập dữ liệu và bật dịch ngoại lệ sang DataAccessException. "@Configuration" đánh dấu lớp chứa các phương thức @Bean khai báo cấu hình; nó có thể dùng kèm để bật AOP nhưng không định nghĩa aspect.
Mở trang câu hỏi này →
Aspring-boot-starter-web
Bspring-boot-starter-data-jpa
Cspring-boot-starter-test
Dspring-boot-devtools
Lời giải
Đáp án đúng: "spring-boot-starter-data-jpa". Starter này kéo theo Spring Data JPA, Hibernate làm JPA provider, spring-jdbc và HikariCP làm connection pool; khi thấy chúng trên classpath cùng thông tin spring.datasource, auto-configuration tự dựng DataSource, EntityManagerFactory, transaction manager và bật quét các interface repository. "spring-boot-starter-web" dùng cho Spring MVC và Tomcat nhúng, không chứa JPA. "spring-boot-starter-test" cung cấp JUnit, Mockito, AssertJ cho kiểm thử, thường đặt ở phạm vi test. "spring-boot-devtools" chỉ hỗ trợ lúc phát triển như tự khởi động lại và LiveReload, không thêm khả năng truy cập dữ liệu. Ngoài starter này vẫn cần driver của cơ sở dữ liệu cụ thể như mysql-connector-j, nhưng đó là phần bổ sung chứ không phải thứ bật Spring Data JPA.
Mở trang câu hỏi này →
AEAGER
BLAZY
CDEPENDENT
DCASCADE
Lời giải
Đáp án đúng: "LAZY". Theo đặc tả JPA, kiểu nạp mặc định của @ManyToMany là FetchType.LAZY, cũng như @OneToMany: vì phía kia là một tập hợp có thể rất lớn, JPA chỉ đặt một proxy hay collection bao ngoài và chỉ truy vấn bảng nối khi mã thực sự duyệt tập hợp đó, nhờ vậy tránh nạp thừa dữ liệu. "EAGER" là mặc định của các quan hệ trỏ tới một đối tượng đơn là @ManyToOne và @OneToOne, ở @ManyToMany chỉ có khi khai báo tường minh fetch = FetchType.EAGER. "DEPENDENT" không phải giá trị nào của enum FetchType, vốn chỉ có LAZY và EAGER. "CASCADE" là khái niệm khác, quy định thao tác như persist hay remove có lan sang thực thể liên quan không, được khai báo qua thuộc tính cascade chứ không phải kiểu nạp.
Mở trang câu hỏi này →
A.xml
B.conf
C.java
D.yml
Lời giải
Đáp án đúng: ".java". Cấu hình Spring dựa trên annotation (Java-based configuration) được viết thẳng bằng mã Java: một lớp gắn @Configuration chứa các phương thức @Bean, kết hợp @ComponentScan hay @EnableTransactionManagement, được lưu trong tệp nguồn Java rồi biên dịch như mọi lớp khác, thay cho cách khai báo bean trong XML truyền thống. ".xml" là phần mở rộng của cấu hình XML kiểu applicationContext với thẻ bean, chính là thứ cấu hình annotation thay thế. ".conf" không phải định dạng cấu hình chuẩn của Spring, thường gặp ở cấu hình máy chủ như Nginx. ".yml" là tệp YAML mà Spring Boot dùng cho application.yml để khai báo giá trị thuộc tính như cổng, URL cơ sở dữ liệu; nó chứa dữ liệu cấu hình chứ không định nghĩa bean bằng annotation.
Mở trang câu hỏi này →
AUser sessions
BEntity lifecycle and persistence
CNetwork connections
DWeb page rendering
Lời giải
Đáp án đúng: "Entity lifecycle and persistence". EntityManager là API trung tâm của JPA, gắn với một persistence context (ngữ cảnh lưu trữ): nó đưa thực thể qua các trạng thái new, managed, detached, removed bằng persist, merge, detach, remove, tìm thực thể bằng find, tạo truy vấn JPQL, và đồng bộ thay đổi xuống cơ sở dữ liệu khi flush hoặc commit nhờ dirty checking. "User sessions" là phiên HTTP do servlet container và HttpSession quản lý, không phải việc của tầng persistence. "Network connections" sai vì kết nối cơ sở dữ liệu do DataSource và connection pool như HikariCP lo, EntityManager chỉ dùng chúng. "Web page rendering" là việc của view như Thymeleaf, nằm ở tầng hiển thị chứ không ở tầng dữ liệu.
Mở trang câu hỏi này →
AReact
BVue.js
CThymeleaf
DAngular
Lời giải
Đáp án đúng: "Thymeleaf". Thymeleaf là template engine phía máy chủ: controller Spring MVC trả tên view, ThymeleafViewResolver tìm tệp HTML tương ứng trong thư mục templates rồi dựng trang từ dữ liệu trong model trước khi gửi về trình duyệt, nên nó là công nghệ view gắn trực tiếp với Spring MVC và được Spring Boot tự cấu hình qua spring-boot-starter-thymeleaf. "React" là thư viện JavaScript dựng giao diện phía trình duyệt; nó dùng được cùng ứng dụng Spring qua REST API nhưng là frontend tách rời, không phải view do Spring MVC dựng. "Vue.js" cũng là framework JavaScript phía client, quan hệ với Spring chỉ qua gọi API JSON. "Angular" là framework SPA (ứng dụng một trang) chạy trên trình duyệt, cùng lắm được phục vụ như tệp tĩnh chứ không đi qua ViewResolver.
Mở trang câu hỏi này →
ASelection variable expressions.
BURL expressions.
CMessage expressions.
DFragment expressions.
Lời giải
Đáp án đúng: "Selection variable expressions.". Trong Thymeleaf, *{...} là biểu thức biến lựa chọn: nó được đánh giá trên đối tượng đang được chọn bằng th:object chứ không phải trên toàn bộ model, ví dụ form có th:object="${user}" thì bên trong th:field="*{name}" tương đương ${user.name}; đây là cách viết gọn rất hay dùng khi gắn form với đối tượng. "URL expressions." là cú pháp @{...}, dùng để dựng đường dẫn có context path và tham số. "Message expressions." là cú pháp #{...}, dùng để tra khoá thông điệp 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.
Mở trang câu hỏi này →
A@FXML
B@Bind
C@UI
D@Node
Lời giải
Đáp án đúng: "@FXML". Khi FXMLLoader nạp tệp FXML, nó tạo controller được chỉ định bằng fx:controller rồi tiêm các nút có fx:id vào trường cùng tên trong controller; trường hoặc phương thức xử lý sự kiện không public phải gắn @FXML thì loader mới truy cập được, ví dụ trường nameField kiểu TextField và phương thức handleSave được gọi từ thuộc tính onAction trong FXML. Như vậy @FXML là cầu nối giữa phần tử khai báo trong FXML và mã Java. "@Bind" không phải annotation của JavaFX; ràng buộc dữ liệu trong JavaFX làm bằng phương thức bind trên property. "@UI" không tồn tại trong API JavaFX. "@Node" cũng không phải annotation; Node là lớp cơ sở của mọi phần tử trong scene graph chứ không dùng để đánh dấu trường.
Mở trang câu hỏi này →