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

144/179 câuCòn 35
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
Đá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.
Mở trang câu hỏi này →
A@Primary
B@Id
C@Generated
D@Key
Lời giải
Đáp án đúng: "@Id". Trong JPA, @Id đặt lên trường hoặc getter để chỉ định khoá chính của entity; mỗi entity bắt buộc có định danh như vậy (hoặc @EmbeddedId cho khoá ghép), persistence context dùng khoá này để nhận diện thực thể, và nó thường đi kèm @GeneratedValue để sinh giá trị tự động. "@Primary" là annotation của Spring, chọn bean ưu tiên khi có nhiều bean cùng kiểu để tiêm, không liên quan tới bảng. "@Generated" không phải annotation khoá chính của JPA: Hibernate có một annotation cùng tên để đọc lại giá trị cột do cơ sở dữ liệu sinh, còn jakarta.annotation.Generated đánh dấu mã nguồn được sinh tự động. "@Key" không tồn tại trong đặc tả JPA, có lẽ dễ nhầm với từ khoá PRIMARY KEY của SQL.
Mở trang câu hỏi này →
ACSS stylesheets.
BMessage resolvers.
CDatabase triggers.
DJavaScript libraries.
Lời giải
Đáp án đúng: "Message resolvers.". Thymeleaf hỗ trợ đa ngôn ngữ (internationalization, i18n) qua cơ chế message resolver: template dùng biểu thức #{...} như #{home.welcome}, engine nhờ message resolver tra khoá đó theo locale hiện tại; khi tích hợp với Spring, resolver này dựa vào MessageSource đọc các tệp messages.properties, messages_vi.properties, và LocaleResolver quyết định ngôn ngữ của từng yêu cầu. "CSS stylesheets." chỉ định dạng trình bày, không chứa hay chọn văn bản theo ngôn ngữ. "Database triggers." là đoạn mã chạy trong cơ sở dữ liệu khi có thao tác ghi, không liên quan tới engine template. "JavaScript libraries." có thể làm i18n phía trình duyệt, nhưng đó không phải cơ chế của Thymeleaf vốn render phía server.
Mở trang câu hỏi này →
AJDBC
BJPQL (Java Persistence Query Language)
CSQL
DXML
Lời giải

Đáp án đúng: "JPQL (Java Persistence Query Language)". JPQL là ngôn ngữ truy vấn của đặc tả JPA, viết theo tên entity và tên trường của lớp Java thay vì tên bảng và tên cột, ví dụ SELECT s FROM Student s WHERE s.gpa > 3; JPA provider như Hibernate dịch câu đó sang SQL đúng phương ngữ của cơ sở dữ liệu, kết quả trả về là đối tượng entity, và nó hỗ trợ đi theo quan hệ bằng dấu chấm hay JOIN FETCH. "JDBC" là API cấp thấp để gửi câu SQL thô và đọc ResultSet, ta tự chuyển dòng thành đối tượng. "SQL" chính là ngôn ngữ thao tác trên bảng và cột mà câu hỏi muốn tránh; JPA vẫn cho chạy native query nhưng đó không phải truy vấn hướng đối tượng. "XML" là định dạng dữ liệu, dùng cho tệp cấu hình như persistence.xml chứ không phải ngôn ngữ truy vấn.

Mở trang câu hỏi này →
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
Đá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.
Mở trang câu hỏi này →
AIncreased coupling between application layers.
BAbility to use only the modules needed, reducing application size.
CLimited support for different persistence technologies.
DDecreased flexibility in choosing application components.
Lời giải
Đáp án đúng: "Ability to use only the modules needed, reducing application size.". Spring Framework được chia thành nhiều mô-đun như spring-core, spring-beans, spring-context, spring-jdbc, spring-orm, spring-webmvc; ứng dụng chỉ khai báo những mô-đun mình dùng, ví dụ ứng dụng dòng lệnh không cần spring-webmvc, nhờ vậy giảm số thư viện phải đóng gói và giữ phụ thuộc gọn. "Increased coupling between application layers." sai vì mục tiêu của Spring là giảm phụ thuộc chặt (coupling) nhờ DI và lập trình qua interface. "Limited support for different persistence technologies." ngược với thực tế: Spring hỗ trợ JDBC, JPA, Hibernate, MyBatis và các kho NoSQL qua Spring Data. "Decreased flexibility in choosing application components." cũng ngược lại, vì kiến trúc mô-đun cho phép tự chọn và thay thế từng thành phần.
Mở trang câu hỏi này →
ABackground thread management
BWeb API development
CDesktop GUI development
DDatabase access
Lời giải
Đáp án đúng: "Desktop GUI development". JavaFX là bộ công cụ của Java để xây dựng giao diện đồ hoạ cho ứng dụng desktop: nó cung cấp Stage, Scene, cây Node với các control như Button, TextField, TableView, bố cục như GridPane, VBox, hỗ trợ FXML để tách giao diện khỏi mã, định dạng bằng CSS, hiệu ứng và đồ hoạ; nó là bản kế nhiệm Swing. "Background thread management" không phải mục đích chính, JavaFX chỉ có lớp hỗ trợ như Task và Service để chạy việc nền mà không làm treo giao diện, còn quản lý luồng nói chung thuộc java.util.concurrent. "Web API development" là phạm vi của Spring MVC hay Jakarta REST. "Database access" do JDBC, JPA hoặc Spring Data đảm nhận, JavaFX chỉ hiển thị dữ liệu.
Mở trang câu hỏi này →
A@OneToOne
B@ManyToOne
C@OneToMany
D@ManyToMany
Lời giải
Đáp án đúng: "@OneToMany". Trong quan hệ một nhiều, phía một (ví dụ Department) giữ một tập hợp các entity phía nhiều (danh sách Employee), nên trường tập hợp đó được gắn @OneToMany, thường viết @OneToMany(mappedBy = "department") để chỉ ra phía nhiều mới là chủ quan hệ, nơi giữ cột khoá ngoại, kèm cascade hay orphanRemoval nếu cần. "@ManyToOne" là annotation của chiều ngược lại, đặt trên trường department trong Employee ở phía nhiều, trỏ tới một đối tượng đơn chứ không quản lý tập hợp. "@OneToOne" mô tả quan hệ một một, mỗi bên chỉ có tối đa một đối tượng. "@ManyToMany" mô tả quan hệ nhiều nhiều qua bảng nối, khi phần tử con có thể thuộc về nhiều cha cùng lúc, khác với một nhiều.
Mở trang câu hỏi này →
133What is an "advice" in Spring AOP?4 lựa chọn
AA point in the execution of a program.
BAn object being proxied.
CThe action taken at a particular join point.
DA collection of join points.
Lời giải
Đáp án đúng: "The action taken at a particular join point.". Theo thuật ngữ AOP mà Spring dùng, advice là hành động do aspect thực hiện tại một join point cụ thể, có các loại before, after returning, after throwing, after và around, ví dụ ghi log trước khi gọi một phương thức service. "A point in the execution of a program." là định nghĩa join point, trong Spring AOP luôn là một lần gọi phương thức. "An object being proxied." là target object, đối tượng được advise mà Spring bọc bằng proxy. "A collection of join points." gần với pointcut, tức biểu thức chọn ra tập join point mà advice sẽ áp vào; pointcut quyết định ở đâu, còn advice quyết định làm gì.
Mở trang câu hỏi này →
AThe database table name.
BThe primary key of the "many" side entity.
CThe field in the "many" side entity that maps back to the "one" side entity.
DThe join table name.
Lời giải
Đáp án đúng: "The field in the "many" side entity that maps back to the "one" side entity.". Trong quan hệ hai chiều, ví dụ Department có danh sách employees đánh dấu @OneToMany và Employee có trường department đánh dấu @ManyToOne, mappedBy trên phía Department ghi tên trường department ở phía nhiều; nó báo JPA rằng phía nhiều mới là phía sở hữu quan hệ (owning side), nơi giữ cột khoá ngoại, còn phía một chỉ phản chiếu nên không sinh thêm cột hay bảng nối. "The database table name." sai vì tên bảng đặt bằng @Table. "The primary key of the "many" side entity." sai vì khoá chính của entity bên nhiều khai báo bằng @Id trong chính entity đó, mappedBy không nhắc tới khoá. "The join table name." sai vì bảng nối đặt bằng @JoinTable, và dùng mappedBy chính là để khỏi cần bảng nối mà tái dùng khoá ngoại phía nhiều.
Mở trang câu hỏi này →
ALabel
BButton
CTextField
DImageView
Lời giải
Đáp án đúng: "Label". Trong JavaFX, Label là control dùng để hiển thị một đoạn văn bản không chỉnh sửa được, như tiêu đề hay nhãn đặt cạnh ô nhập; nội dung đặt bằng setText() hoặc thuộc tính text trong FXML, có thể kèm một graphic. Người dùng chỉ đọc chứ không gõ vào Label. "Button" cũng mang chữ trên mặt nút, nhưng vai trò của nó là nhận thao tác nhấn và phát ActionEvent, không phải để hiển thị văn bản. "TextField" là ô nhập một dòng, dùng để người dùng gõ văn bản vào và chương trình đọc lại bằng getText(). "ImageView" dùng để hiển thị ảnh từ đối tượng Image chứ không hiển thị chữ.
Mở trang câu hỏi này →
ATo manage database connections.
BTo respond to user interactions.
CTo handle network requests.
DTo manage application configurations.
Lời giải
Đáp án đúng: "To respond to user interactions.". Ứng dụng JavaFX chạy theo hướng sự kiện: khi người dùng bấm nút, gõ phím, di chuột hay đóng cửa sổ, JavaFX tạo đối tượng sự kiện như ActionEvent, KeyEvent, MouseEvent rồi chuyển qua chuỗi điều phối tới nút đích, nơi các handler đăng ký bằng setOnAction, addEventHandler hoặc thuộc tính onAction trong FXML được gọi trên JavaFX Application Thread để phản hồi, như kiểm tra form rồi lưu dữ liệu. "To manage database connections." là việc của JDBC, bể kết nối hay EntityManagerFactory, không phải của cơ chế sự kiện. "To handle network requests." thuộc các API mạng như HttpClient, nên chạy ở luồng nền để không làm treo giao diện. "To manage application configurations." là việc của tệp properties hay Preferences, không liên quan tới xử lý thao tác người dùng.
Mở trang câu hỏi này →
AController class
BHTML page
CRepository/DAO class
DJSP scriptlet
Lời giải
Đáp án đúng: "Repository/DAO class". Trong ứng dụng Spring MVC kết hợp Hibernate theo kiến trúc phân lớp, thao tác cơ sở dữ liệu đặt ở lớp Repository hay DAO (Data Access Object, đối tượng truy cập dữ liệu), đánh dấu @Repository; lớp này dùng Session của Hibernate, EntityManager hoặc Spring Data, và Spring tự dịch ngoại lệ của Hibernate sang DataAccessException. Service gọi repository, controller gọi service. "Controller class" chỉ nên nhận yêu cầu và chọn view; viết truy vấn ở đây trộn tầng web với tầng dữ liệu, khó kiểm thử và tái sử dụng. "HTML page" là tầng hiển thị chạy ở trình duyệt, không thể và không được chạm cơ sở dữ liệu. "JSP scriptlet" là mã Java nhúng trong JSP; về kỹ thuật chạy được JDBC nhưng là cách làm lỗi thời, phá vỡ việc tách lớp của MVC.
Mở trang câu hỏi này →
138In JavaFX, what is a Property?4 lựa chọn
AA static variable.
BA dynamic, observable value.
CA database field.
DA network address.
Lời giải
Đáp án đúng: "A dynamic, observable value.". Trong JavaFX, property như StringProperty, IntegerProperty hay ObjectProperty là đối tượng bọc một giá trị có thể thay đổi và cho phép đăng ký listener (ChangeListener, InvalidationListener) để được báo khi giá trị đổi; nhờ tính quan sát được (observable) đó mà có binding, ví dụ label.textProperty().bind(nameProperty) giúp giao diện tự cập nhật theo dữ liệu. "A static variable." sai vì property thường là thành viên của từng đối tượng, và quan trọng hơn là nó phát thông báo khi thay đổi, điều một biến static thông thường không làm. "A database field." sai vì property là khái niệm của tầng giao diện, có thể được nạp từ một cột nhưng bản thân không gắn với cơ sở dữ liệu. "A network address." sai vì property không liên quan gì tới mạng.
Mở trang câu hỏi này →
AObserver
BModel-View-Controller
CDecorator
DCommand
Lời giải
Đáp án đúng: "Model-View-Controller". Spring MVC được xây dựng theo mẫu MVC: Controller, các lớp gắn @Controller, nhận yêu cầu và gọi tầng nghiệp vụ; Model chứa dữ liệu cần hiển thị; View như template Thymeleaf hay JSP trình bày dữ liệu đó; tất cả được điều phối qua DispatcherServlet theo mẫu Front Controller. "Observer" là mẫu cho phép nhiều đối tượng đăng ký nhận thông báo khi một đối tượng thay đổi, Spring có dùng ý tưởng này cho ApplicationEvent nhưng Spring MVC không dựa trên nó. "Decorator" là mẫu bọc đối tượng để thêm hành vi, không phải nền tảng của framework web này. "Command" là mẫu đóng gói một yêu cầu thành đối tượng, cũng không phải kiến trúc tổng thể của Spring MVC.
Mở trang câu hỏi này →
AAs a listener.
BAs a filter.
CAs a servlet.
DAs a resource.
Lời giải
Đáp án đúng: "As a servlet.". DispatcherServlet bản chất là một lớp con của HttpServlet, nên trong web.xml nó được khai báo bằng thẻ servlet với servlet-name và servlet-class là org.springframework.web.servlet.DispatcherServlet, thường kèm init-param contextConfigLocation trỏ tới tệp cấu hình Spring và load-on-startup, rồi gắn đường dẫn bằng servlet-mapping, ví dụ url-pattern là dấu gạch chéo để nhận mọi yêu cầu. "As a listener." là cách khai báo ContextLoaderListener, thành phần khởi tạo root application context khi ứng dụng web khởi động, không phải DispatcherServlet. "As a filter." dùng cho các Filter như CharacterEncodingFilter hay DelegatingFilterProxy của Spring Security, chạy trước servlet. "As a resource." không phải cách đăng ký thành phần xử lý yêu cầu; thẻ resource-ref trong web.xml chỉ khai báo tham chiếu tới tài nguyên JNDI như DataSource.
Mở trang câu hỏi này →
AViewResolver
BHandlerMapping
CController
DModel
Lời giải
Đáp án đúng: "HandlerMapping". Luồng xử lý của DispatcherServlet: nhận yêu cầu, hỏi các HandlerMapping, chẳng hạn RequestMappingHandlerMapping đọc @RequestMapping, @GetMapping, để tìm handler (phương thức controller) cùng các interceptor phù hợp, rồi dùng HandlerAdapter gọi handler, nhận model và tên view, cuối cùng nhờ ViewResolver phân giải view. "ViewResolver" xuất hiện ở cuối luồng, đổi tên view logic thành view thật, không chọn controller. "Controller" là chính đối tượng cần được tìm ra, nó không tự quyết định yêu cầu nào thuộc về mình. "Model" chỉ là vùng chứa dữ liệu truyền từ controller sang view, không tham gia việc định tuyến yêu cầu.
Mở trang câu hỏi này →
AUnrelated to Spring MVC and cannot bind to model attributes
BBinding-aware JSP tags that integrate with Spring MVC to bind form fields to model properties
CA replacement for HTML input elements and attributes
DOnly supports GET forms and not POST
Lời giải
Đáp án đúng: "Binding-aware JSP tags that integrate with Spring MVC to bind form fields to model properties". Thư viện thẻ form của Spring cung cấp các thẻ JSP như form:form, form:input, form:select, form:errors; thẻ form:form gắn với một đối tượng trong model qua modelAttribute, mỗi form:input với thuộc tính path đọc giá trị thuộc tính tương ứng để điền sẵn và đặt tên trường đúng, để khi gửi lên data binding của Spring MVC gán ngược vào đối tượng, còn form:errors hiển thị lỗi kiểm hợp lệ. "Unrelated to Spring MVC and cannot bind to model attributes" sai vì gắn với model attribute chính là lý do thư viện tồn tại. "A replacement for HTML input elements and attributes" sai vì các thẻ này cuối cùng vẫn sinh ra thẻ HTML input, select chuẩn và cho truyền thuộc tính HTML qua; chúng bổ sung khả năng binding chứ không thay thế HTML. "Only supports GET forms and not POST" sai vì form:form mặc định dùng POST và còn hỗ trợ PUT, DELETE qua trường ẩn kết hợp HiddenHttpMethodFilter.
Mở trang câu hỏi này →
Aapplication.yml
Bpom.xml / build.gradle
Cbeans.xml
Dsettings.json
Lời giải
Đáp án đúng: "pom.xml / build.gradle". Dependency của dự án Spring Boot được khai báo trong tệp build: với Maven là pom.xml, thường kế thừa spring-boot-starter-parent và liệt kê các starter như spring-boot-starter-web; với Gradle là build.gradle dùng plugin org.springframework.boot. Công cụ build đọc tệp này để tải thư viện về classpath, rồi Spring Boot dựa vào thư viện có mặt mà tự cấu hình. "application.yml" là tệp cấu hình thuộc tính lúc chạy như cổng server hay chuỗi kết nối cơ sở dữ liệu, không khai báo thư viện. "beans.xml" là tệp định nghĩa bean kiểu XML của Spring truyền thống. "settings.json" là tệp cài đặt của trình soạn thảo như VS Code, không liên quan tới dependency của dự án.
Mở trang câu hỏi này →
A@Component
B@Service
C@SpringBootApplication
D@Repository
Lời giải
Đáp án đúng: "@SpringBootApplication". Lớp chứa phương thức main gọi SpringApplication.run thường được gắn @SpringBootApplication, một annotation tổng hợp gồm @SpringBootConfiguration (lớp cấu hình), @EnableAutoConfiguration (bật tự cấu hình theo thư viện có trên classpath) và @ComponentScan (quét bean bắt đầu từ package của chính lớp đó); vì vậy lớp main nên đặt ở package gốc. "@Component" chỉ đánh dấu một lớp là bean thông thường, không bật tự cấu hình hay quét thành phần. "@Service" là stereotype cho tầng nghiệp vụ. "@Repository" là stereotype cho tầng truy cập dữ liệu, kèm dịch exception lưu trữ. Gắn @Component, @Service hay @Repository lên lớp main chỉ biến nó thành bean chứ không khởi động được cơ chế của Spring Boot.
Mở trang câu hỏi này →