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

64/179 câuCòn 115
ATo define the primary key of the entities.
BTo specify the join table and its columns.
CTo define the entity relationships.
DTo create a new database.
Lời giải
Đáp án đúng: "To specify the join table and its columns.". Trong quan hệ @ManyToMany, hai bảng thực thể được nối qua một bảng trung gian; @JoinTable đặt ở phía sở hữu quan hệ để khai báo tên bảng nối qua name, cột khoá ngoại trỏ về thực thể hiện tại qua joinColumns và cột trỏ về thực thể bên kia qua inverseJoinColumns. Nếu bỏ đi, JPA tự đặt tên bảng nối theo quy ước mặc định. "To define the primary key of the entities." sai vì khoá chính khai báo bằng @Id, có thể kèm @GeneratedValue. "To define the entity relationships." sai vì chính @ManyToMany mới định nghĩa quan hệ, @JoinTable chỉ cấu hình cách lưu quan hệ đó. "To create a new database." sai vì không annotation JPA nào tạo cơ sở dữ liệu; bảng nối có thể được sinh khi bật tính năng tạo schema, nhưng đó là bảng chứ không phải cơ sở dữ liệu.
Mở trang câu hỏi này →
AlookupByEmailLikeIgnoreCase(String email)
BfindByEmailContainingIgnoreCase(String email)
CqueryWhereEmailContainsCaseInsensitive(String email)
DselectEmailContainsIgnoreCase(String email)
Lời giải
Đáp án đúng: "findByEmailContainingIgnoreCase(String email)". Spring Data JPA phân tích tên phương thức: tiền tố findBy mở phần điều kiện, Email là thuộc tính của entity, từ khoá Containing sinh điều kiện LIKE có ký tự đại diện ở hai đầu giá trị, còn IgnoreCase bọc cả hai vế bằng UPPER để so không phân biệt hoa thường. "lookupByEmailLikeIgnoreCase(String email)" sai vì lookup không phải tiền tố hợp lệ (chỉ có find, read, get, query, search, stream, count, exists, delete), và Like không tự thêm ký tự đại diện nên người gọi phải tự truyền dấu phần trăm. "queryWhereEmailContainsCaseInsensitive(String email)" sai vì thiếu chữ By ngăn tiền tố với điều kiện, còn Where và CaseInsensitive không phải từ khoá, nên dù Contains là đồng nghĩa của Containing thì tên vẫn không phân tích được. "selectEmailContainsIgnoreCase(String email)" sai vì select không phải tiền tố hợp lệ và cũng thiếu By, Spring Data coi cả chuỗi là tên thuộc tính không tồn tại.
Mở trang câu hỏi này →
A@OneToOne
B@ManyToOne
C@OneToMany
D@ManyToMany
Lời giải

Đáp án đúng: "@OneToMany". Annotation @OneToMany của JPA khai báo một thực thể giữ tập hợp nhiều thực thể kia, ví dụ một Department có List<Employee>; thường đi kèm mappedBy trỏ tới trường @ManyToOne ở phía Employee, và trong cơ sở dữ liệu quan hệ này được thể hiện bằng cột khoá ngoại đặt ở bảng phía nhiều. "@OneToOne" dành cho quan hệ một một, như User với Profile, mỗi bên chỉ gắn với đúng một bản ghi bên kia. "@ManyToOne" là chiều ngược lại của quan hệ một nhiều, gắn ở phía nhiều như Employee trỏ về một Department; nó cũng tham gia quan hệ này nhưng câu hỏi hỏi annotation khai báo phía một giữ nhiều. "@ManyToMany" dành cho quan hệ nhiều nhiều như Student với Course, thường cần bảng nối.

Mở trang câu hỏi này →
48Spring Data JPA is built on top of:4 lựa chọn
ASpring MVC
BSpring Core
CJPA
DServlets
Lời giải
Đáp án đúng: "JPA". Spring Data JPA là một module của dự án Spring Data, xây trên đặc tả JPA (Jakarta Persistence API): nó không tự ánh xạ đối tượng sang bảng mà dùng EntityManager của một JPA provider như Hibernate bên dưới, rồi bổ sung các repository như JpaRepository, sinh truy vấn từ tên phương thức và @Query để bớt mã lặp. Vì thế nền móng trực tiếp mà nó dựa vào là JPA. "Spring MVC" là framework web xử lý yêu cầu HTTP; Spring Data JPA dùng được cả trong ứng dụng không có web nên không phụ thuộc vào nó. "Spring Core" cung cấp container IoC mà mọi module Spring đều cần, nên Spring Data JPA đúng là chạy trong đó, nhưng câu hỏi nhắm tới công nghệ truy cập dữ liệu mà nó trừu tượng hoá. "Servlets" là API web của Jakarta EE, không liên quan tới tầng lưu trữ.
Mở trang câu hỏi này →
AJpaRepository
BCrudService
CEntityManager
DJdbcTemplate
Lời giải
Đáp án đúng: "JpaRepository". JpaRepository là interface của Spring Data JPA, kế thừa các interface CRUD và phân trang của Spring Data, nên khi khai báo một interface mở rộng JpaRepository cho thực thể Student với khoá Long, Spring tự sinh hiện thực có sẵn save, findById, findAll, deleteById, count cùng phân trang, sắp xếp và flush. "CrudService" không phải interface có trong Spring, chỉ là tên tự đặt. "EntityManager" là API của JPA có persist, find, merge, remove, tức làm được CRUD, nhưng đó là đối tượng quản lý persistence context ở tầng thấp, không phải interface repository cung cấp sẵn thao tác CRUD theo kiểu Spring Data. "JdbcTemplate" là lớp tiện ích của Spring JDBC để chạy câu SQL tự viết, không phải interface và không có sẵn phương thức CRUD theo thực thể.
Mở trang câu hỏi này →
AsearchBy
BfindBy
CgetWhere
DqueryFor
Lời giải
Đáp án đúng: "findBy". Trong Spring Data, chỉ cần khai báo phương thức như findByLastName(String lastName) trong interface kế thừa JpaRepository, bộ phân tích tên sẽ tách tiền tố findBy, nhận LastName là thuộc tính của entity và sinh truy vấn lọc theo cột tương ứng; findBy là tiền tố thông dụng nhất và được tài liệu Spring Data dùng làm ví dụ chuẩn cho derived query (truy vấn suy từ tên phương thức). "searchBy" thực ra cũng được các phiên bản Spring Data mới chấp nhận như một đồng nghĩa, nhưng ít dùng và không phải từ khoá tiêu biểu mà câu hỏi nhắm tới. "getWhere" sai vì thiếu By: get là tiền tố hợp lệ nhưng phải viết getBy, còn Where không phải từ khoá nên tên không được phân tích. "queryFor" sai tương tự, query chỉ hợp lệ khi đi cùng By, phần For không có nghĩa trong cú pháp này.
Mở trang câu hỏi này →
ARendering HTML views from Thymeleaf templates
BCreating, wiring, configuring beans and managing their lifecycle
CExecuting SQL statements without any JDBC driver
DCompiling Java sources at runtime
Lời giải
Đáp án đúng: "Creating, wiring, configuring beans and managing their lifecycle". IoC container (bộ chứa đảo ngược điều khiển) của Spring, cụ thể là BeanFactory và ApplicationContext, đọc cấu hình từ annotation, lớp @Configuration hoặc XML rồi tự tạo bean, tiêm phụ thuộc vào nhau, áp cấu hình và quản lý vòng đời từ khởi tạo, gọi @PostConstruct cho tới @PreDestroy khi đóng context; mã nghiệp vụ không còn tự new đối tượng nữa. "Rendering HTML views from Thymeleaf templates" là việc của engine template Thymeleaf cùng ViewResolver trong tầng web, container chỉ quản lý các bean đó chứ không tự render. "Executing SQL statements without any JDBC driver" là điều không thể, mọi truy cập cơ sở dữ liệu quan hệ trong Java đều cần driver JDBC. "Compiling Java sources at runtime" là việc của trình biên dịch javac hay công cụ build, container chỉ làm việc với lớp đã biên dịch.
Mở trang câu hỏi này →
ADefining user interfaces.
BImplementing cross-cutting concerns like logging and security.
CManaging database transactions.
DCreating web service clients.
Lời giải
Đáp án đúng: "Implementing cross-cutting concerns like logging and security.". AOP (Aspect-Oriented Programming, lập trình hướng khía cạnh) tách những mối quan tâm cắt ngang (cross-cutting concern) như ghi log, kiểm tra quyền, đo thời gian, quản lý giao dịch ra khỏi mã nghiệp vụ: ta viết chúng một lần trong một aspect với advice như @Before hay @Around, chỉ định nơi áp dụng bằng pointcut, và Spring tạo proxy bọc quanh bean để chèn advice khi phương thức được gọi. "Defining user interfaces." là việc của tầng view như Thymeleaf hay JavaFX, không phải AOP. "Managing database transactions." là một ứng dụng cụ thể của AOP, vì @Transactional chạy qua proxy và advice giao dịch, nhưng đó chỉ là một trường hợp, còn mục đích chung của AOP rộng hơn nhiều. "Creating web service clients." thuộc RestTemplate, WebClient hay OpenFeign, không phải mục đích của AOP.
Mở trang câu hỏi này →
ADispatcherServlet
BBeanFactory or ApplicationContext
CViewResolver
DHandlerMapping
Lời giải
Đáp án đúng: "BeanFactory or ApplicationContext". Spring Core Container chính là IoC container, với BeanFactory là interface gốc và ApplicationContext là bản mở rộng thường dùng; chúng đọc cấu hình, tạo bean, tiêm phụ thuộc, gọi các callback khởi tạo như @PostConstruct, quản lý phạm vi singleton hay prototype và gọi callback huỷ khi đóng context, tức nắm toàn bộ vòng đời bean. "DispatcherServlet" là front controller của Spring MVC, nhận yêu cầu HTTP và điều phối tới controller; nó lấy bean từ một WebApplicationContext chứ không tự quản lý vòng đời bean. "ViewResolver" chỉ ánh xạ tên view logic thành view thật như trang Thymeleaf. "HandlerMapping" chỉ tìm handler phù hợp cho một yêu cầu. Các thành phần web vừa kể đều nằm ngoài Core Container và chính chúng cũng là bean do container quản lý.
Mở trang câu hỏi này →
AAspect
BAdvice
CJoin Point
DPointcut
Lời giải
Đáp án đúng: "Join Point". Join point (điểm nối) là một thời điểm cụ thể trong quá trình thực thi chương trình nơi advice có thể được áp vào, như lời gọi phương thức, xử lý ngoại lệ hay gán trường; Spring AOP dựa trên proxy nên chỉ hỗ trợ join point là việc thực thi phương thức của bean. "Aspect" là mô-đun gom một mối quan tâm cắt ngang như ghi log hay giao dịch, chứa cả advice lẫn pointcut, không phải một điểm trong luồng chạy. "Advice" là hành động được thực thi tại join point, ví dụ Before, After hay Around, tức là cái được áp vào chứ không phải nơi áp. "Pointcut" là biểu thức chọn ra những join point nào sẽ nhận advice, ví dụ một biểu thức execution chọn mọi phương thức trong gói service; nó lọc các điểm chứ bản thân không phải là một điểm thực thi.
Mở trang câu hỏi này →
ABy adding a foreign key column to one of the entities.
BBy adding a foreign key column to both entities.
CBy using a join table that contains foreign keys referencing both entities.
DBy storing the related entities in a serialized format within a single column.
Lời giải
Đáp án đúng: "By using a join table that contains foreign keys referencing both entities.". Trong mô hình quan hệ, một hàng ở bảng này có thể liên kết với nhiều hàng ở bảng kia và ngược lại, nên không cột khoá ngoại đơn nào diễn tả được; JPA dùng bảng nối (join table) mà mỗi hàng gồm hai khoá ngoại trỏ về khoá chính của hai thực thể, có thể đặt tên qua @JoinTable với joinColumns và inverseJoinColumns, ví dụ bảng student_course giữa Student và Course. "By adding a foreign key column to one of the entities." là cách biểu diễn quan hệ một nhiều hoặc một một, một cột chỉ chứa được một giá trị nên không chứa nổi nhiều liên kết. "By adding a foreign key column to both entities." vẫn chỉ cho mỗi hàng trỏ tới đúng một hàng bên kia, không thành nhiều nhiều. "By storing the related entities in a serialized format within a single column." phá vỡ chuẩn hoá, không truy vấn hay ràng buộc toàn vẹn được, JPA không dùng cách đó cho quan hệ.
Mở trang câu hỏi này →
AObjects control the creation of their dependencies.
BThe framework or container controls the creation and management of objects.
CObjects are responsible for managing the application's flow.
DMethods control the instantiation of classes.
Lời giải
Đáp án đúng: "The framework or container controls the creation and management of objects.". Inversion of Control (đảo ngược điều khiển) nghĩa là đối tượng không tự new các phụ thuộc và không tự quyết định vòng đời của mình nữa; quyền đó chuyển cho container, trong Spring là ApplicationContext, nơi đọc cấu hình, tạo bean, tiêm phụ thuộc qua Dependency Injection, gọi các callback khởi tạo và huỷ. Mã ứng dụng chỉ khai báo mình cần gì. "Objects control the creation of their dependencies." mô tả đúng cách làm truyền thống mà IoC muốn đảo ngược, khi lớp tự gọi new cho phụ thuộc và bị gắn chặt vào cài đặt cụ thể. "Objects are responsible for managing the application's flow." cũng là kiểu điều khiển truyền thống, mã của ta gọi thư viện, trong khi với IoC chính framework gọi ngược vào mã của ta. "Methods control the instantiation of classes." chỉ là cách nói khác của việc tự tạo đối tượng, như factory method do lập trình viên tự viết, không chuyển quyền cho container.
Mở trang câu hỏi này →
AStage
BNode
CPane
DScene
Lời giải
Đáp án đúng: "Scene". JavaFX dùng hình ảnh sân khấu: Stage là cửa sổ, Scene là nội dung đặt trong cửa sổ đó, chứa đồ thị cảnh (scene graph) gồm một node gốc và mọi node con; gọi stage.setScene(scene) để hiển thị vùng nội dung này, và đổi Scene là đổi toàn bộ nội dung cửa sổ. "Stage" là chính cửa sổ cấp cao nhất với thanh tiêu đề, kích thước, nút đóng, không phải vùng nội dung bên trong. "Node" là lớp cơ sở của mọi phần tử trong đồ thị cảnh như Button hay Label, chỉ là một mảnh của nội dung. "Pane" là một layout chứa node con, thường làm node gốc của Scene, nhưng nó chỉ là một phần trong vùng nội dung, chưa phải lớp đại diện cho vùng nội dung của cửa sổ.
Mở trang câu hỏi này →
Apersist()
Binsert()
Csave()
Dupdate()
Lời giải
Đáp án đúng: "save()". JpaRepository kế thừa CrudRepository nên có save(S entity); cài đặt mặc định SimpleJpaRepository kiểm tra entity mới hay cũ (thường dựa vào id null hoặc trường @Version): entity mới thì gọi entityManager.persist để INSERT, entity đã có thì gọi entityManager.merge để UPDATE, rồi trả về thực thể đang được quản lý. "persist()" là phương thức của EntityManager trong JPA thuần, chỉ dùng cho entity mới và không nằm trong interface JpaRepository. "insert()" không tồn tại trong JpaRepository; Spring Data không tách riêng thao tác chèn. "update()" cũng không phải phương thức của JpaRepository; muốn cập nhật thì sửa entity rồi gọi save, hoặc viết phương thức có @Modifying kèm @Query.
Mở trang câu hỏi này →
ALabel
BButton
CTextField
DImageView
Lời giải
Đáp án đúng: "ImageView". Trong JavaFX, ImageView là Node dùng để hiển thị một đối tượng Image đã nạp từ tệp hoặc URL, ví dụ new ImageView(new Image("logo.png")), và cho phép chỉnh kích thước bằng setFitWidth, setFitHeight hay giữ tỉ lệ bằng setPreserveRatio; Image chứa dữ liệu ảnh, còn ImageView là thứ vẽ nó lên Scene. "Label" dùng để hiển thị chữ, tuy có thể gắn kèm một graphic nhưng vai trò chính vẫn là nhãn văn bản và graphic đó thường lại chính là một ImageView. "Button" là nút bấm nhận thao tác nhấn và phát ActionEvent. "TextField" là ô cho người dùng gõ một dòng văn bản, không có chức năng hiển thị ảnh.
Mở trang câu hỏi này →
AGridPane
BBorderPane
CVBox
DHBox
Lời giải
Đáp án đúng: "BorderPane". BorderPane là layout của JavaFX chia vùng chứa thành năm khu vực theo các cạnh: top, bottom, left, right và center, đặt nút bằng setTop, setBottom, setLeft, setRight, setCenter; vùng center chiếm phần diện tích còn lại, rất hợp cho bố cục cửa sổ có thanh menu ở trên, thanh trạng thái ở dưới và nội dung chính ở giữa. "GridPane" sắp nút theo lưới hàng và cột, định vị bằng chỉ số hàng cột chứ không theo vùng biên. "VBox" xếp các nút con thành một cột dọc từ trên xuống. "HBox" xếp các nút con thành một hàng ngang từ trái sang phải. Cả GridPane, VBox lẫn HBox đều không có khái niệm các vùng biên của cửa sổ, muốn có bố cục như vậy phải lồng nhiều layout.
Mở trang câu hỏi này →
AEncrypt API data
BRender views
CManage database transactions programmatically
DBuild Spring Boot jars
Lời giải
Đáp án đúng: "Manage database transactions programmatically". PlatformTransactionManager là interface trung tâm của hạ tầng giao dịch Spring, với các phương thức getTransaction, commit và rollback; có các hiện thực như DataSourceTransactionManager cho JDBC và JpaTransactionManager cho JPA. Lập trình viên có thể gọi trực tiếp hoặc qua TransactionTemplate để quản lý giao dịch bằng mã, và chính @Transactional kiểu khai báo cũng dựa vào nó phía sau. "Encrypt API data" sai vì mã hoá dữ liệu thuộc Spring Security hoặc thư viện mật mã, không liên quan giao dịch. "Render views" là việc của ViewResolver và view như Thymeleaf. "Build Spring Boot jars" là việc của công cụ build như plugin Maven hoặc Gradle của Spring Boot, không phải một bean chạy lúc ứng dụng hoạt động.
Mở trang câu hỏi này →
AA database connection.
BA model and view.
CA user interface.
DA security token.
Lời giải
Đáp án đúng: "A model and view.". Trong Spring MVC, sau khi phương thức controller xử lý xong, nó trả cho DispatcherServlet thông tin để dựng phản hồi: hoặc một đối tượng ModelAndView chứa dữ liệu và tên view, hoặc một String tên view kèm dữ liệu đã đặt vào Model; DispatcherServlet sau đó nhờ ViewResolver tìm view và dựng HTML từ model. Với @RestController thì đối tượng trả về được chuyển thẳng thành JSON, nhưng với controller dựng trang truyền thống thì model kèm view là kết quả điển hình. "A database connection." sai vì kết nối cơ sở dữ liệu do DataSource và tầng repository quản lý, controller không trao nó ra ngoài. "A user interface." sai vì controller không tự dựng giao diện; view mới là thứ hiển thị, controller chỉ chỉ ra view nào. "A security token." sai vì token bảo mật do Spring Security hoặc tầng xác thực phát hành, không phải kết quả thông thường của một controller.
Mở trang câu hỏi này →
ATo handle user input.
BTo display data to the user.
CTo manage the application's data and business logic.
DTo route requests to the appropriate handlers.
Lời giải
Đáp án đúng: "To manage the application's data and business logic.". Trong mẫu MVC (Model-View-Controller), Model là phần nắm dữ liệu và quy tắc nghiệp vụ của ứng dụng, độc lập với cách hiển thị; trong Spring MVC, phần này gồm các thực thể, service và repository, còn đối tượng Model truyền sang view chỉ là chỗ đựng dữ liệu mà controller đã chuẩn bị. "To handle user input." là vai trò của Controller, nơi nhận yêu cầu, đọc tham số rồi gọi Model. "To display data to the user." là vai trò của View, như template Thymeleaf hoặc trang JSP, chỉ trình bày dữ liệu nhận được. "To route requests to the appropriate handlers." là việc của bộ điều phối như DispatcherServlet cùng HandlerMapping trong Spring MVC, thuộc khung xử lý chứ không phải Model.
Mở trang câu hỏi này →
64Which annotation marks a controller?4 lựa chọn
A@Controller
B@Service
C@Repository
D@RestResource
Lời giải
Đáp án đúng: "@Controller". @Controller là stereotype annotation (annotation đánh dấu vai trò) cho lớp xử lý yêu cầu web trong Spring MVC; nó được gắn @Component nên lớp được component scanning phát hiện và đăng ký làm bean, đồng thời Spring MVC quét các phương thức có @RequestMapping hay @GetMapping trong lớp đó để làm handler. Giá trị trả về thường là tên view. "@Service" cũng là một stereotype nhưng dành cho tầng nghiệp vụ, không được coi là handler web. "@Repository" đánh dấu tầng truy cập dữ liệu và còn bật cơ chế dịch exception của tầng lưu trữ sang DataAccessException của Spring. "@RestResource" là annotation của Spring Data REST dùng để tuỳ chỉnh đường dẫn hay ẩn hiện một repository khi được xuất thành tài nguyên REST, không đánh dấu controller.
Mở trang câu hỏi này →