SBA301DễKỳ 7Chuyên ngành Cập nhật 04/08/2026

Tích hợp ứng dụng trang đơn với Spring Boot - Integrate single page application with Spring Boot

SBA301 - Phát triển ứng dụng trang đơn (Single Page Application) dạy cách dựng một ứng dụng web có hai nửa ghép lại: ReactJS chạy trong trình duyệt và dịch vụ REST viết bằng Spring Boot chạy trên máy chủ. Câu hỏi xuyên suốt là ranh giới giữa hai nửa đó nằm ở đâu, dữ liệu đi qua lại thế nào và ai chịu trách nhiệm phần nào. Nửa trình duyệt bắt đầu từ JSX cùng cách chia giao diện thành component, rồi tới trạng thái: React Hooks với useState, useEffect, useMemo, useCallback, các ràng buộc của Rules of Hooks, và lối giữ state ở component hàm đặt cạnh lối cũ ở component lớp. Bộ component dựng sẵn React-Bootstrap lo phần trình bày. Việc chuyển trang không còn do máy chủ đảm nhận mà do định tuyến phía client với React Router v6, kèm tham số đường dẫn đọc bằng useParams và trang 404 bắt ở cuối bảng route. Để lấy dữ liệu, môn đi qua nền bất đồng bộ của JavaScript gồm Promise và async/await, rồi tới thư viện Axios cho các lời gọi thực tế. Nửa máy chủ mở bằng nền tảng HTTP và nguyên tắc của một REST API, sau đó dựng dịch vụ bằng Spring Boot với các chú giải ánh xạ yêu cầu như RequestBody, PathVariable, RequestParam, cách đặt mã trạng thái và thân phản hồi. Tài liệu cho dịch vụ được sinh sống bằng OpenAPI và Swagger, còn phần kiểm thử dùng bộ khởi tạo spring-boot-starter-test để chạy thử cả tầng web lẫn toàn bộ ứng dụng. Tầng dữ liệu có hai nhánh. Nhánh quan hệ dùng JPA và Hibernate với ánh xạ đối tượng sang bảng, Session và Transaction, khoá lạc quan chống xung đột khi ghi đồng thời, phân trang cùng lựa chọn Slice khi không cần đếm toàn bộ bản ghi, và hbm2ddl sinh lược đồ. Nhánh tài liệu dùng MongoDB với lược đồ linh hoạt, Spring Data MongoDB, MongoTemplate cho truy vấn phức tạp và dịch vụ đám mây MongoDB Atlas. Khép môn là bảo mật với Spring Security, từ xác thực cơ bản và phiên làm việc tới token JWT cho dịch vụ phi trạng thái. Học xong, người học dựng được trọn một ứng dụng trang đơn có đăng nhập, gọi dịch vụ REST, lưu dữ liệu ở cả cơ sở dữ liệu quan hệ lẫn cơ sở dữ liệu tài liệu, và có tài liệu mô tả giao diện lập trình kèm theo.

171Câu hỏi
2Bộ đề
11Chủ đề

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

104/171 câuCòn 67
85Which HTTP method is used by default when making a fetch request?4 lựa chọnDễ83% trả lời đúng
APOST
BGET
CDELETE
DPUT
Lời giải
Khi thực hiện yêu cầu fetch, phương thức HTTP mặc định được sử dụng là GET. Phương thức GET được sử dụng để yêu cầu dữ liệu từ một nguồn, thường được sử dụng để tải xuống dữ liệu từ một URL. Trong trường hợp fetch, phương thức GET được sử dụng mặc định vì nó phù hợp với mục đích của yêu cầu fetch, đó là tải xuống dữ liệu từ một nguồn. Tuy nhiên, người dùng có thể thay đổi phương thức HTTP được sử dụng bằng cách chỉ định phương thức cụ thể trong phương thức fetch.
Mở trang câu hỏi này →
86What does the fetch() function in JavaScript return?4 lựa chọnDễ83% trả lời đúng
AAn XMLHttpRequest object
BA Promise
CA callback function
DA JSON object
Lời giải
Hàm fetch() trong JavaScript trả về một đối tượng Promise. Đối tượng Promise này sẽ được thực hiện khi hàm fetch() được gọi và sẽ trả về một đối tượng Response. Đối tượng Response này chứa dữ liệu được yêu cầu từ server. Đối tượng Promise này cho phép chúng ta sử dụng các phương thức như then(), catch() để xử lý dữ liệu trả về từ server.
Mở trang câu hỏi này →
87How can you handle errors in an Axios request?4 lựa chọnDễ100% trả lời đúng
AUsing .error()
BUsing .catch()
CUsing .handle()
DUsing .fail()
Lời giải
Để xử lý lỗi trong một yêu cầu Axios, bạn có thể sử dụng phương thức .catch(). Phương thức này được sử dụng để bắt các lỗi xảy ra trong quá trình thực hiện yêu cầu. Khi sử dụng .catch(), bạn có thể viết mã để xử lý lỗi và đảm bảo rằng ứng dụng của mình vẫn hoạt động bình thường ngay cả khi có lỗi xảy ra. Ví dụ, bạn có thể sử dụng .catch() để hiển thị thông báo lỗi cho người dùng hoặc để thực hiện hành động khác khi có lỗi xảy ra. Ngoài ra, bạn cũng có thể sử dụng phương thức .then() để thực hiện hành động khi yêu cầu được thực hiện thành công.
Mở trang câu hỏi này →
88How can you set a default base URL in Axios?4 lựa chọnDễ100% trả lời đúng
Aaxios.defaults.baseURL = 'https://api.example.com'
Baxios.configure.baseURL = 'https://api.example.com'
Caxios.setBaseURL('https://api.example.com')
Daxios.baseURL('https://api.example.com')
Lời giải
Để đặt một URL cơ bản mặc định trong Axios, bạn có thể sử dụng thuộc tính `baseURL` của đối tượng `defaults`. Điều này cho phép bạn thiết lập một URL cơ bản mà tất cả các yêu cầu sẽ sử dụng. Ví dụ, nếu bạn muốn đặt URL cơ bản mặc định là `https://api.example.com`, bạn có thể thực hiện như sau: `axios.defaults.baseURL = 'https://api.example.com'`. Điều này sẽ áp dụng cho tất cả các yêu cầu được thực hiện sau đó. Ngoài ra, bạn cũng có thể sử dụng phương thức `defaults` để đặt URL cơ bản mặc định, nhưng cách này không được khuyến khích.
Mở trang câu hỏi này →
89Which of the following is the correct way to make a GET request using Axios?4 lựa chọnDễ83% trả lời đúng
Aaxios.get('https://api.example.com/data')
Baxios.send('GET', 'https://api.example.com/data')
Caxios.fetch('https://api.example.com/data')
Dfetch.axios('https://api.example.com/data')
Lời giải

Để thực hiện một yêu cầu GET sử dụng Axios, bạn cần sử dụng phương thức get() của Axios. Phương thức này chấp nhận một tham số là URL của API mà bạn muốn yêu cầu. Ví dụ, để yêu cầu dữ liệu từ API 'https://api.example.com/data', bạn có thể sử dụng mã sau: axios.get('https://api.example.com/data'). Phương thức này sẽ gửi một yêu cầu GET đến API và trả về dữ liệu trong dạng JSON. Ngoài ra, bạn cũng có thể sử dụng các tham số khác như headers, params để tùy chỉnh yêu cầu của mình. Ví dụ, để thêm một header 'Authorization' với giá trị 'Bearer token', bạn có thể sử dụng mã sau:

Lời giải
axios.get('https://api.example.com/data', {
  headers: {
    'Authorization': 'Bearer token'
  }
}

).

Mở trang câu hỏi này →
90What is the purpose of the @RequestParam annotation?4 lựa chọnDễ100% trả lời đúng
AMaps headers to method parameters
BBinds form data to method parameters
CMaps path variables to fields
DMaps query parameters to method parameters
Lời giải

Annotation @RequestParam được sử dụng trong Spring MVC để ánh xạ các tham số truy vấn (query parameters) trong URL đến các tham số phương thức (method parameters) của một phương thức controller. Điều này cho phép bạn dễ dàng lấy giá trị của các tham số truy vấn và sử dụng chúng trong logic của phương thức. Ví dụ, nếu bạn có một phương thức controller như sau: @GetMapping("/users")

Lời giải
public String getUsers(@RequestParam("name") String name, @RequestParam("age") int age) {
  ...
}

thì @RequestParam("name") và @RequestParam("age") sẽ ánh xạ các tham số truy vấn "name" và "age" trong URL đến các tham số phương thức "name" và "age".

Mở trang câu hỏi này →
91Which Spring annotation is used to map HTTP GET requests to a method?4 lựa chọnTrung bình60% trả lời đúng
A@RequestGet
B@Get
C@HttpGet
D@GetMapping
Lời giải

Để ánh xạ các yêu cầu HTTP GET đến một phương thức, chúng ta sử dụng annotation @GetMapping trong Spring. Annotation này cho phép chúng ta định nghĩa một phương thức có thể được gọi khi nhận được yêu cầu GET từ client. Ví dụ, nếu chúng ta có một phương thức như sau: @GetMapping("/users")

Lời giải
public List<User> getUsers() {
    // logic để lấy danh sách người dùng
}

Thì khi client gửi yêu cầu GET đến đường dẫn /users, phương thức getUsers() sẽ được gọi và trả về danh sách người dùng. Annotation @GetMapping là một trong những annotation quan trọng trong Spring, giúp chúng ta xây dựng các ứng dụng web hiệu quả và dễ dàng quản lý.

Mở trang câu hỏi này →
92How can you specify the response status code in a REST controller?4 lựa chọnDễ100% trả lời đúng
ABy using HttpServletResponse
BYou cannot control the status code
CBy using @ResponseStatus annotation
DBy returning an int
Lời giải
Để chỉ định mã trạng thái phản hồi trong một controller REST, bạn có thể sử dụng một trong các phương pháp sau. Phương pháp đầu tiên là sử dụng HttpServletResponse. Tuy nhiên, phương pháp này không được khuyến khích vì nó yêu cầu bạn phải sử dụng phương thức sendError() để chỉ định mã trạng thái. Phương pháp thứ hai là bạn không thể kiểm soát mã trạng thái. Phương pháp thứ ba là sử dụng @ResponseStatus annotation. Đây là phương pháp được khuyến khích nhất vì nó cho phép bạn dễ dàng chỉ định mã trạng thái cho phương thức controller của mình. Phương pháp thứ tư là bằng cách trả về một giá trị int. Tuy nhiên, phương pháp này cũng không được khuyến khích vì nó có thể gây nhầm lẫn và khó bảo trì.
Mở trang câu hỏi này →
93What is the primary purpose of a RESTful web service in Spring Boot?4 lựa chọnDễ100% trả lời đúng
ATo render HTML content
BTo provide data through JSON or XML over HTTP
CTo connect to a database
DTo secure the application with OAuth2
Lời giải
Mục đích chính của một dịch vụ web RESTful trong Spring Boot là cung cấp dữ liệu thông qua JSON hoặc XML qua HTTP. Dịch vụ web RESTful sử dụng các phương thức HTTP như GET, POST, PUT, DELETE để tương tác với các nguồn dữ liệu. Khi một yêu cầu HTTP được gửi đến dịch vụ web RESTful, nó sẽ xử lý yêu cầu và trả về dữ liệu phù hợp theo định dạng JSON hoặc XML. Điều này cho phép các ứng dụng khác nhau có thể giao tiếp với dịch vụ web RESTful và sử dụng dữ liệu được cung cấp. Ví dụ, một ứng dụng web có thể sử dụng dịch vụ web RESTful để tải xuống dữ liệu từ một cơ sở dữ liệu và hiển thị dữ liệu đó trên trang web.
Mở trang câu hỏi này →
A@RestStatus
B@StatusCode
C@ResponseStatus
D@HttpStatus
Lời giải
Để trả về một trạng thái HTTP cụ thể từ một phương thức, bạn cần sử dụng một trong các chú thích sau. Trong đó, chú thích @ResponseStatus là lựa chọn chính xác.
Mở trang câu hỏi này →
A@PostMapping and @RequestBody
B@GetMapping and @PathVariable
C@PostMapping and @RequestParam
D@PostMapping and @ResponseBody
Lời giải

Để xác định một phương thức xử lý yêu cầu POST và chấp nhận cơ thể yêu cầu, bạn cần sử dụng hai annotation đặc biệt trong Spring MVC. Đầu tiên, bạn cần sử dụng @PostMapping để chỉ định phương thức xử lý yêu cầu POST. Thứ hai, bạn cần sử dụng @RequestBody để chỉ định rằng phương thức này sẽ chấp nhận cơ thể yêu cầu được gửi đi. Điều này cho phép bạn truy cập vào dữ liệu được gửi đi trong cơ thể yêu cầu. Ví dụ, nếu bạn muốn tạo một phương thức xử lý yêu cầu POST để tạo một tài khoản mới, bạn có thể sử dụng @PostMapping và @RequestBody như sau: @PostMapping("/taikhoan")

Lời giải
public ResponseEntity<TaiKhoan> taoTaiKhoan(@RequestBody TaiKhoan taiKhoan) {
    // Xử lý tạo tài khoản
}

Trong ví dụ trên, @PostMapping chỉ định phương thức xử lý yêu cầu POST, và @RequestBody chỉ định rằng phương thức này sẽ chấp nhận cơ thể yêu cầu được gửi đi.

Mở trang câu hỏi này →
96What is the purpose of the @RequestBody annotation?4 lựa chọnDễ100% trả lời đúng
AMaps the request body to a Java object
BBinds a query parameter to a method
CInjects beans into controller
DValidates request parameters
Lời giải
Annotation @RequestBody được sử dụng để ánh xạ cơ thể yêu cầu (request body) sang một đối tượng Java. Điều này cho phép bạn nhận dữ liệu từ cơ thể yêu cầu và ánh xạ nó sang một đối tượng Java, sau đó sử dụng đối tượng này trong phương thức của controller. Ví dụ, nếu bạn có một phương thức controller với một đối tượng Java như là tham số, annotation @RequestBody sẽ ánh xạ dữ liệu từ cơ thể yêu cầu sang đối tượng đó. Điều này giúp bạn dễ dàng xử lý dữ liệu từ cơ thể yêu cầu và sử dụng nó trong ứng dụng của mình.
Mở trang câu hỏi này →
97Which annotation would you use to create a REST endpoint that consumes only XML data?4 lựa chọnTrung bình40% trả lời đúng
A@RequestMapping(produces = "application/xml")
B@GetMapping(consumes = "application/json")
C@PostMapping(produces = "application/json")
D@PostMapping(consumes = "application/xml")
Lời giải

Để tạo một điểm cuối REST chỉ chấp nhận dữ liệu XML, bạn cần sử dụng annotation @PostMapping với thuộc tính consumes được đặt thành "application/xml". Điều này cho phép Spring MVC chỉ chấp nhận yêu cầu HTTP POST có nội dung dạng XML. Ví dụ, nếu bạn muốn tạo một điểm cuối REST để tạo mới một tài nguyên, bạn có thể sử dụng annotation @PostMapping với consumes được đặt thành "application/xml" như sau: @PostMapping(consumes = "application/xml")

Lời giải
public ResponseEntity<Resource> createResource(@RequestBody Resource resource) {
  ...
}

Trong ví dụ trên, điểm cuối REST sẽ chỉ chấp nhận yêu cầu HTTP POST có nội dung dạng XML, và sẽ sử dụng phương thức createResource để xử lý yêu cầu đó.

Mở trang câu hỏi này →
A@JsonRequest
B@PostMapping with @RequestBody and @ResponseBody
C@Consumes and @Produces
D@RequestBody
Lời giải

Để định nghĩa một phương thức xử lý cả hai định dạng yêu cầu và phản hồi JSON, chúng ta cần sử dụng các annotation @PostMapping, @RequestBody và @ResponseBody. @PostMapping được sử dụng để chỉ định phương thức HTTP được sử dụng để gửi yêu cầu đến server. @RequestBody được sử dụng để ánh xạ dữ liệu từ yêu cầu HTTP sang một đối tượng Java. @ResponseBody được sử dụng để ánh xạ một đối tượng Java sang dữ liệu HTTP. Ví dụ, nếu chúng ta muốn tạo một phương thức xử lý yêu cầu và phản hồi JSON, chúng ta có thể sử dụng các annotation như sau: @PostMapping(value = "/example", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)

Lời giải
public ResponseEntity<String> example(@RequestBody String request) {
    // Xử lý yêu cầu và trả về phản hồi
    return ResponseEntity.ok("Phản hồi từ server");
}

Bằng cách sử dụng các annotation này, chúng ta có thể định nghĩa một phương thức xử lý cả hai định dạng yêu cầu và phản hồi JSON.

Mở trang câu hỏi này →
99What is the effect of using @RestController instead of @Controller?4 lựa chọnDễ100% trả lời đúng
AIt forces methods to return HTML views
BIt applies @ResponseBody to all methods by default
CIt disables automatic serialization
DIt disables exception handling
Lời giải
Khi sử dụng @RestController thay vì @Controller, bạn sẽ thấy một số thay đổi quan trọng. @RestController là một annotation đặc biệt trong Spring MVC, được thiết kế để tạo ra các RESTful API. Nó có tác dụng tự động áp dụng @ResponseBody cho tất cả các phương thức trong lớp, điều này có nghĩa là bất kỳ phương thức nào cũng sẽ trả về dữ liệu JSON hoặc XML theo mặc định. Điều này giúp giảm thiểu sự phức tạp khi tạo ra các API RESTful, vì bạn không cần phải thêm @ResponseBody vào từng phương thức. Ngoài ra, @RestController cũng tự động áp dụng các quy tắc về dữ liệu trả về, giúp đảm bảo rằng dữ liệu được trả về đúng định dạng và cấu trúc.
Mở trang câu hỏi này →
100What does ResponseEntity provide in a REST controller method?4 lựa chọnDễ100% trả lời đúng
AA flexible way to set body, status, and headers
BOnly status codes
CA way to redirect to views
DOnly body
Lời giải
Trong REST controller, ResponseEntity cung cấp một cách linh hoạt để thiết lập cơ thể, trạng thái và tiêu đề của phản hồi. Điều này cho phép bạn có nhiều quyền kiểm soát hơn đối với phản hồi của ứng dụng, bao gồm cả việc thiết lập trạng thái HTTP cụ thể, thêm tiêu đề tùy chỉnh và thiết lập cơ thể phản hồi theo cách mong muốn. Điều này đặc biệt hữu ích khi bạn cần trả về một phản hồi phức tạp hoặc cần thiết lập trạng thái HTTP cụ thể để thông báo cho khách hàng về kết quả của yêu cầu.
Mở trang câu hỏi này →
101How can you bind a custom header value from a request to a method parameter?4 lựa chọnTrung bình67% trả lời đúng
A@HeaderParam
B@RequestHeader
C@RequestBody
D@RequestParam
Lời giải
Để gắn giá trị của một tiêu đề tùy chỉnh từ một yêu cầu đến một tham số phương thức, bạn có thể sử dụng annotation @RequestHeader. Annotation này cho phép bạn gắn giá trị của một tiêu đề tùy chỉnh từ yêu cầu HTTP đến một tham số phương thức của phương thức hiện tại. Ví dụ, nếu bạn muốn gắn giá trị của tiêu đề 'Authorization' đến một tham số phương thức 'token', bạn có thể sử dụng @RequestHeader('Authorization') ở trên tham số phương thức 'token'.
Mở trang câu hỏi này →
102What is the purpose of the @DBRef annotation in Spring Data MongoDB?4 lựa chọnDễ100% trả lời đúng
ATo map embedded documents
BTo index a document
CTo define a relationship between documents via reference
DTo ignore the field during persistence
Lời giải
Trong Spring Data MongoDB, @DBRef là một annotation được sử dụng để định nghĩa mối quan hệ giữa các tài liệu MongoDB thông qua tham chiếu. Khi sử dụng @DBRef, bạn có thể định nghĩa một tài liệu tham chiếu đến một tài liệu khác trong cùng một cơ sở dữ liệu. Điều này cho phép bạn thực hiện các truy vấn phức tạp và quản lý mối quan hệ giữa các tài liệu một cách hiệu quả. Ví dụ, nếu bạn có một tài liệu người dùng và một tài liệu thông tin liên hệ, bạn có thể sử dụng @DBRef để định nghĩa mối quan hệ giữa hai tài liệu này. Điều này giúp bạn có thể truy vấn thông tin liên hệ của một người dùng một cách dễ dàng.
Mở trang câu hỏi này →
103How does MongoDB ensure high availability with replication?4 lựa chọnDễ100% trả lời đúng
ABy using SQL mirroring
BBy using cron jobs for backup
CThrough replica sets with automatic failover
DBy distributing indexes across servers
Lời giải
MongoDB đảm bảo tính sẵn sàng cao bằng cách sử dụng các tập bản sao (replica sets) với khả năng tự động chuyển đổi (automatic failover). Tập bản sao là một nhóm các máy chủ MongoDB hoạt động cùng nhau để lưu trữ dữ liệu và đảm bảo tính sẵn sàng cao. Khi một máy chủ trong tập bản sao gặp sự cố, các máy chủ khác trong tập bản sao sẽ tự động chuyển đổi sang trạng thái hoạt động, đảm bảo dữ liệu vẫn được truy cập và cập nhật một cách liên tục. Điều này giúp ngăn chặn sự cố mất dữ liệu và đảm bảo tính sẵn sàng cao của hệ thống.
Mở trang câu hỏi này →
104In Spring Boot, which starter dependency is used to include MongoDB support?4 lựa chọnDễ100% trả lời đúng
Aspring-boot-mongodb
Bspring-boot-starter-data-mongodb
Cspring-boot-starter-data-jpa
Dspring-boot-starter-mongo
Lời giải
Để thêm hỗ trợ MongoDB vào ứng dụng Spring Boot, bạn cần thêm starter dependency có tên là spring-boot-starter-data-mongodb vào file pom.xml hoặc build.gradle của dự án. Starter này bao gồm các thư viện cần thiết để kết nối với MongoDB và thực hiện các hoạt động CRUD (Create, Read, Update, Delete) trên dữ liệu. Ngoài ra, nó cũng cung cấp các tính năng như hỗ trợ các loại dữ liệu khác nhau, kiểm tra dữ liệu, và các công cụ khác để giúp bạn quản lý dữ liệu hiệu quả hơn. Khi thêm starter này vào dự án, bạn có thể sử dụng các lớp như MongoTemplate để thực hiện các hoạt động CRUD và các phương thức khác để tương tác với MongoDB.
Mở trang câu hỏi này →