HSF302Chưa đoKỳ 5Tự chọn Cập nhật 23 giờ 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

44/179 câuCòn 135
AXML
BJSON
CHTML
DCSV
Lời giải
Đáp án đúng: "JSON". Trong REST hiện đại và đặc biệt với Spring, khi controller @RestController trả về đối tượng Java, Spring MVC dùng HttpMessageConverter để chuyển đối tượng thành thân phản hồi, và Spring Boot cấu hình sẵn Jackson nên định dạng mặc định là JSON (JavaScript Object Notation), gọn, dễ đọc, trình duyệt và ứng dụng di động phân tích nhanh. "XML" vẫn dùng được nếu thêm thư viện jackson-dataformat-xml và client gửi Accept là application/xml, nhưng đó là lựa chọn bổ sung, không phải mặc định. "HTML" là định dạng của trang web hiển thị cho người, thường do view như Thymeleaf sinh, không phải định dạng dữ liệu của API REST. "CSV" chỉ hợp cho xuất bảng dữ liệu phẳng, không biểu diễn được đối tượng lồng nhau và không được Spring dùng mặc định.
Mở trang câu hỏi này →
26What is the result of this Thymeleaf fragment?4 lựa chọncó code
Đề bài
<span th:if="${user.loggedIn}">Welcome!</span>
ARenders always
BDisplays if user.loggedIn is false
CDisplays nothing by default
DDisplays "Welcome!" only if user is logged in
Lời giải
Đáp án đúng: "Displays "Welcome!" only if user is logged in". Thuộc tính th:if của Thymeleaf đánh giá biểu thức user.loggedIn trên đối tượng user trong model lúc dựng trang ở máy chủ; nếu kết quả là true thì thẻ span cùng dòng chữ Welcome! được giữ lại trong HTML trả về, còn nếu false hoặc null thì Thymeleaf loại bỏ hẳn cả thẻ khỏi đầu ra chứ không chỉ ẩn bằng CSS. "Renders always" sai vì phần tử mang th:if chỉ được dựng khi điều kiện đúng; muốn luôn hiển thị thì bỏ th:if đi. "Displays if user.loggedIn is false" đảo ngược điều kiện, đó là hành vi của th:unless chứ không phải th:if. "Displays nothing by default" sai vì không có cơ chế mặc định ẩn nào: kết quả phụ thuộc hoàn toàn vào giá trị loggedIn lúc dựng trang, đúng thì lời chào vẫn hiện ra.
Mở trang câu hỏi này →
27You have a controller: @RestController4 lựa chọncó code
Đề bài
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
Đá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.
Mở trang câu hỏi này →
AIt specifies the primary key field of an entity
BIt maps an entity field to a table column and allows setting column attributes
CIt marks a field that should not be persisted
DIt defines a many-to-many relationship
Lời giải
Đáp án đúng: "It maps an entity field to a table column and allows setting column attributes". Trong JPA, mỗi trường persistent của entity mặc định ánh xạ tới cột cùng tên; @Column cho phép ghi rõ tên cột và các thuộc tính như name, nullable, unique, length, precision, scale, insertable, updatable, columnDefinition, ví dụ @Column(name = "full_name", nullable = false, length = 100). Hibernate dùng các thông tin này khi sinh DDL tạo bảng và khi dựng câu SQL. "It specifies the primary key field of an entity" là vai trò của @Id, thường đi cùng @GeneratedValue để sinh giá trị khoá. "It marks a field that should not be persisted" là @Transient, trường đó bị bỏ qua hoàn toàn khi lưu và nạp. "It defines a many-to-many relationship" là @ManyToMany, thường kèm @JoinTable để mô tả bảng nối giữa hai entity.
Mở trang câu hỏi này →
A@Table
B@Entity
C@Column
D@Id
Lời giải
Đáp án đúng: "@Entity". Theo đặc tả JPA, annotation @Entity đặt trên lớp báo cho persistence provider như Hibernate rằng lớp này là một thực thể được quản lý, ánh xạ tới một bảng, và EntityManager có thể persist, find, merge nó; mỗi thực thể bắt buộc có khoá chính. "@Table" chỉ là tuỳ chọn bổ sung để đặt tên bảng, schema khi tên mặc định không hợp, bản thân nó không biến lớp thành thực thể. "@Column" cấu hình ánh xạ của một trường tới cột như tên cột, độ dài, cho phép rỗng hay không. "@Id" đánh dấu trường khoá chính của thực thể; nó cần thiết bên trong một thực thể nhưng không phải dấu hiệu khai báo lớp là thực thể. Thiếu @Entity thì các annotation kia trên lớp đều không có tác dụng.
Mở trang câu hỏi này →
ADependency Injection
BAnnotations
CEntity Relationships
DTransactions
Lời giải
Đáp án đúng: "Entity Relationships". JPA cho phép mô tả quan hệ giữa các entity, tương ứng với quan hệ khoá ngoại giữa các bảng, bằng các ánh xạ @OneToOne, @OneToMany, @ManyToOne và @ManyToMany kèm @JoinColumn hoặc @JoinTable; nhờ đó có thể đi từ đối tượng này sang đối tượng liên quan, ví dụ order.getCustomer(), thay vì tự viết câu JOIN. "Dependency Injection" là cơ chế của Spring tiêm phụ thuộc giữa các bean, không liên quan tới quan hệ dữ liệu giữa bảng. "Annotations" là cú pháp khai báo siêu dữ liệu nói chung; ánh xạ quan hệ quả thật được viết bằng annotation, nhưng annotation chỉ là phương tiện và còn dùng cho vô số việc khác như @Id hay @Column, còn tính năng được hỏi là quan hệ entity. "Transactions" bảo đảm một nhóm thao tác cùng thành công hoặc cùng huỷ, không định nghĩa liên kết giữa các bảng.
Mở trang câu hỏi này →
AA low-level JDBC driver for vendor-specific SQL
BA specification for managing relational data in Java applications using object-relational mapping
CA GUI tool for database administration in IntelliJ IDEA
DA NoSQL database used by Java applications
Lời giải
Đáp án đúng: "A specification for managing relational data in Java applications using object-relational mapping". JPA là một đặc tả (specification) của Java, nay thuộc Jakarta EE, định nghĩa cách ánh xạ đối tượng sang bảng quan hệ (ORM) bằng annotation như @Entity, @Id, @OneToMany, cùng API EntityManager và ngôn ngữ truy vấn JPQL; bản thân JPA chỉ là bộ giao diện và luật, phần chạy thật do nhà cung cấp như Hibernate hoặc EclipseLink hiện thực. "A low-level JDBC driver for vendor-specific SQL" sai vì driver JDBC là tầng thấp hơn mà JPA dựa vào bên dưới, JPA còn giúp lập trình viên tránh viết SQL riêng của từng hãng. "A GUI tool for database administration in IntelliJ IDEA" sai vì JPA không phải công cụ giao diện, nó là API dùng trong mã nguồn. "A NoSQL database used by Java applications" sai vì JPA không phải cơ sở dữ liệu và được thiết kế cho dữ liệu quan hệ.
Mở trang câu hỏi này →
AServlet
BEntityManager
CJSP
DJDBC Driver
Lời giải
Đáp án đúng: "EntityManager". EntityManager là giao diện trung tâm của JPA, gắn với một persistence context (ngữ cảnh lưu trữ) là tập các entity đang được quản lý; qua nó ta gọi persist để đưa entity mới vào quản lý, find để nạp theo khoá chính, merge để gộp entity tách rời, remove để xoá và createQuery để chạy JPQL, còn thay đổi trên entity managed được tự động đồng bộ xuống cơ sở dữ liệu khi flush hoặc commit. "Servlet" là thành phần web của Jakarta EE xử lý yêu cầu HTTP, không biết gì về entity. "JSP" là công nghệ trang hiển thị phía máy chủ, thuộc tầng view. "JDBC Driver" là trình điều khiển cấp thấp để gửi câu SQL tới một hệ quản trị cụ thể; JPA provider như Hibernate dùng nó bên dưới, nhưng driver không theo dõi trạng thái entity.
Mở trang câu hỏi này →
A@Column
B@Entity
C@OneToMany
D@Transient
Lời giải
Đáp án đúng: "@OneToMany". Annotation quan hệ trong JPA mô tả cách một thực thể liên kết với thực thể khác; @OneToMany đặt trên thuộc tính tập hợp, ví dụ một Department có danh sách Employee, cho biết một bản ghi phía này gắn với nhiều bản ghi phía kia, thường đi cặp với @ManyToOne ở phía nhiều qua mappedBy. Cùng nhóm còn có @OneToOne, @ManyToOne và @ManyToMany. "@Column" chỉ cấu hình ánh xạ một trường kiểu đơn tới cột của bảng. "@Entity" khai báo lớp là thực thể, không mô tả liên kết giữa các thực thể. "@Transient" đánh dấu trường không được lưu xuống cơ sở dữ liệu, ngược hẳn với việc ánh xạ một quan hệ.
Mở trang câu hỏi này →
34Which class loads FXML files?4 lựa chọn
AFXMLLoader
BScene
CStage
DNode
Lời giải
Đáp án đúng: "FXMLLoader". FXMLLoader đọc tệp FXML (mô tả giao diện bằng XML), dựng cây node tương ứng, tạo đối tượng controller khai báo trong fx:controller, tiêm các trường đánh dấu @FXML rồi trả về nút gốc; cách gọi thường gặp là FXMLLoader.load với URL của tệp .fxml lấy từ getClass().getResource. "Scene" là vùng chứa toàn bộ nội dung của scene graph; nó nhận nút gốc đã được nạp chứ không tự đọc FXML. "Stage" là cửa sổ cấp cao nhất chứa Scene, chỉ lo hiển thị chứ không phân tích tệp. "Node" là lớp cơ sở của mọi thành phần trong scene graph như Button, Label, Pane; kết quả của việc nạp FXML là một Node nhưng bản thân Node không có khả năng nạp tệp giao diện.
Mở trang câu hỏi này →
AEventHandler
BSceneGraph
CController
DAction
Lời giải
Đáp án đúng: "EventHandler". Trong JavaFX, interface EventHandler có phương thức handle nhận đối tượng sự kiện và chính kiểu này nhận và xử lý sự kiện người dùng, ví dụ setOnAction trên một nút là gắn một EventHandler cho ActionEvent, còn setOnKeyPressed gắn một EventHandler cho KeyEvent. "Controller" là chỗ dễ nhầm: lớp controller của FXML đúng là nơi viết các phương thức xử lý như onSaveClick, nhưng nó chỉ là lớp chứa mã, còn khi FXMLLoader nối thuộc tính onAction tới phương thức đó thì thứ được gắn lên control vẫn là một EventHandler, nên kiểu trực tiếp nhận và xử lý sự kiện là EventHandler. "SceneGraph" là cây các Node tạo nên giao diện, sự kiện đi qua cây này nhưng nó không xử lý sự kiện. "Action" không phải một kiểu xử lý trong JavaFX; thứ gần nhất là ActionEvent, tức đối tượng mô tả sự kiện, không phải bộ xử lý.
Mở trang câu hỏi này →
36Which CSS file customizes JavaFX UI?4 lựa chọn
Astyles.css
Bui.css
Cdesign.css
Dtheme.xml
Lời giải
Đáp án đúng: "styles.css". JavaFX cho phép định kiểu giao diện bằng CSS: ta nạp tệp bằng scene.getStylesheets().add(...) hoặc khai báo stylesheets trong FXML, rồi viết bộ chọn như .button với thuộc tính có tiền tố -fx-. Cần nói thẳng là JavaFX không bắt buộc tên tệp nào; giao diện mặc định lấy từ stylesheet nội bộ modena.css, còn styles.css chỉ là tên quen dùng mà các mẫu dự án tạo sẵn, nên đây là đáp án được chọn theo thông lệ. Theo đúng kỹ thuật, "ui.css" hay "design.css" vẫn hoạt động y hệt nếu được nạp vào Scene, chúng chỉ không phải tên thông dụng mà câu hỏi muốn nhắc tới. Riêng "theme.xml" sai hẳn vì đó là tệp XML, không phải CSS, và JavaFX không đọc định kiểu giao diện từ XML.
Mở trang câu hỏi này →
AStage
BScene
CAlert
DPane
Lời giải
Đáp án đúng: "Alert". Lớp javafx.scene.control.Alert, kế thừa Dialog, tạo hộp thoại bật lên dựng sẵn với các loại AlertType như CONFIRMATION, ERROR, WARNING, INFORMATION; gọi showAndWait sẽ hiện hộp thoại và trả về nút người dùng bấm, rất hợp để xác nhận hoặc báo lỗi. "Stage" là cửa sổ cấp cao nhất của JavaFX; tự tạo một Stage mới cũng làm được cửa sổ phụ nhưng phải tự dựng toàn bộ nội dung và nút, không phải lớp chuyên cho hộp thoại thông báo. "Scene" là vùng chứa đồ thị cảnh (scene graph) đặt bên trong một Stage, không phải cửa sổ bật lên. "Pane" chỉ là layout chứa các node con, phải nằm trong một Scene, tự nó không hiển thị thành hộp thoại.
Mở trang câu hỏi này →
ATo improve database performance.
BTo ensure data integrity and prevent errors.
CTo enhance user interface aesthetics.
DTo manage server configurations.
Lời giải
Đáp án đúng: "To ensure data integrity and prevent errors.". Trong ứng dụng JavaFX có thao tác CRUD (tạo, đọc, cập nhật, xoá), kiểm tra hợp lệ (validation) là bước kiểm dữ liệu người dùng nhập trên form, chẳng hạn trường bắt buộc không rỗng, email đúng định dạng, số lượng là số dương, trước khi gọi tầng service để lưu; dữ liệu sai bị chặn và báo lỗi ngay trên giao diện, nhờ vậy cơ sở dữ liệu giữ được tính toàn vẹn và tránh ngoại lệ do vi phạm ràng buộc. "To improve database performance." sai vì kiểm tra hợp lệ không làm truy vấn nhanh hơn; hiệu năng phụ thuộc chỉ mục và thiết kế truy vấn. "To enhance user interface aesthetics." sai vì thông báo lỗi có hiện trên giao diện nhưng mục đích là đúng dữ liệu, không phải thẩm mỹ. "To manage server configurations." sai vì cấu hình máy chủ là việc triển khai, không liên quan tới kiểm dữ liệu nhập.
Mở trang câu hỏi này →
ATo define business logic.
BTo manage user sessions.
CTo provide an abstraction layer for database interactions.
DTo handle application security.
Lời giải
Đáp án đúng: "To provide an abstraction layer for database interactions.". DAO (Data Access Object, đối tượng truy cập dữ liệu) là mẫu thiết kế gom toàn bộ thao tác đọc ghi cơ sở dữ liệu vào một lớp có giao diện rõ ràng như findById, save, delete, giấu đi chi tiết JDBC, JPA hay SQL bên dưới; trong Spring, lớp DAO thường gắn @Repository để được quét thành bean và được dịch ngoại lệ sang DataAccessException, tầng service chỉ gọi DAO mà không biết dữ liệu nằm ở đâu. "To define business logic." là việc của tầng service, nơi điều phối quy tắc nghiệp vụ và gọi DAO. "To manage user sessions." thuộc tầng web hoặc HttpSession, Spring Session, không phải tầng dữ liệu. "To handle application security." là trách nhiệm của Spring Security với filter, xác thực và phân quyền, không phải của DAO.
Mở trang câu hỏi này →
AViewResolver
BController
CDispatcherServlet
DResourceLoader
Lời giải
Đáp án đúng: "ViewResolver". Khi phương thức controller trả về một chuỗi như home, đó chỉ là tên view logic; DispatcherServlet hỏi các ViewResolver đã đăng ký để đổi tên này thành một đối tượng View thật, ví dụ ThymeleafViewResolver ghép tiền tố classpath:/templates/ và hậu tố .html để tìm tệp templates/home.html, còn InternalResourceViewResolver ghép đường dẫn tới tệp JSP. "Controller" chỉ tạo ra tên view và dữ liệu model, không biết template nằm ở đâu. "DispatcherServlet" điều phối toàn bộ luồng và là bên gọi ViewResolver, nhưng việc phân giải tên được uỷ cho ViewResolver chứ nó không tự làm. "ResourceLoader" là giao diện chung để nạp tài nguyên như tệp trên classpath hay hệ thống tệp theo đường dẫn, không có khái niệm tên view.
Mở trang câu hỏi này →
AJdbcTemplate
BJdbcManager
CEntityManager
DSqlHelper
Lời giải
Đáp án đúng: "JdbcTemplate". JdbcTemplate là lớp trung tâm của module Spring JDBC: nó tự mở và đóng Connection, tạo Statement, duyệt ResultSet, xử lý ngoại lệ và dịch SQLException thành DataAccessException, nên lập trình viên chỉ viết câu SQL và một RowMapper để ánh xạ dòng thành đối tượng, bớt hẳn mã lặp lại của JDBC thuần. "JdbcManager" không phải lớp có trong Spring Framework. "EntityManager" thuộc JPA, quản lý thực thể và persistence context, làm việc ở tầng ORM chứ không phải công cụ giản lược JDBC. "SqlHelper" cũng không phải lớp của Spring, chỉ là một cái tên chung chung đặt ra làm nhiễu, dễ gây nhầm với các lớp tiện ích tự viết trong dự án.
Mở trang câu hỏi này →
AHibernate
BEclipseLink
CMyBatis
DAll of the above
Lời giải
Đáp án đúng: "All of the above". Spring không tự làm ORM (ánh xạ đối tượng – quan hệ) mà tích hợp các công cụ có sẵn: Hibernate và EclipseLink là hai bản cài đặt JPA, được nối vào qua lớp hỗ trợ ORM/JPA của Spring như LocalContainerEntityManagerFactoryBean và JpaTransactionManager; MyBatis tích hợp qua dự án mybatis-spring với SqlSessionFactoryBean, dùng chung DataSource và quản lý giao dịch của Spring. Nói chặt chẽ thì MyBatis là công cụ ánh xạ SQL (SQL mapper) chứ không hẳn là ORM, vì lập trình viên tự viết câu SQL còn nó chỉ ánh xạ kết quả sang đối tượng, không quản lý trạng thái entity; tuy vậy cả ba đều dùng được cùng Spring nên đáp án là phương án gộp. Chọn riêng "Hibernate" là bỏ sót, dù đây là provider mặc định của Spring Boot. Chọn riêng "EclipseLink" cũng bỏ sót, dù nó là bản cài đặt tham chiếu của JPA. Chọn riêng "MyBatis" còn kém hơn vì đó lại là công cụ ít giống ORM nhất trong ba.
Mở trang câu hỏi này →
AIt returns an HTML page
BIt converts the return value to JSON or XML
CIt binds request parameters
DIt sets the HTTP status code
Lời giải
Đáp án đúng: "It converts the return value to JSON or XML". Khi một phương thức handler có @ResponseBody, Spring MVC không coi giá trị trả về là tên view nữa mà đưa nó qua HttpMessageConverter phù hợp với header Accept và thư viện có trong classpath để ghi thẳng vào thân phản hồi HTTP, ví dụ đối tượng Java thành JSON nhờ Jackson hoặc thành XML nếu có bộ chuyển XML; @RestController chính là @Controller cộng @ResponseBody cho mọi phương thức. "It returns an HTML page" mô tả hành vi ngược lại, tức handler không có @ResponseBody trả về tên view để ViewResolver render template HTML. "It binds request parameters" là việc của @RequestParam, @PathVariable hay @ModelAttribute. "It sets the HTTP status code" là việc của @ResponseStatus hoặc ResponseEntity, @ResponseBody không đổi mã trạng thái.
Mở trang câu hỏi này →
AController
BModel
CView
DDAO
Lời giải
Đáp án đúng: "View". Trong mô hình MVC, View là thành phần lấy dữ liệu đã chuẩn bị sẵn và dựng thành giao diện người dùng; ở Spring MVC đó là template Thymeleaf, trang JSP hay bất kỳ cài đặt nào của giao diện View, được ViewResolver chọn ra rồi render với dữ liệu trong model để sinh HTML trả về trình duyệt. "Controller" nhận yêu cầu, gọi logic nghiệp vụ và quyết định view nào sẽ hiển thị, nhưng không tự vẽ giao diện. "Model" chỉ là nơi chứa dữ liệu chuyển sang view, không có khả năng hiển thị. "DAO" (Data Access Object, đối tượng truy cập dữ liệu) nằm ở tầng dưới cùng, đọc ghi cơ sở dữ liệu, hoàn toàn tách khỏi giao diện.
Mở trang câu hỏi này →