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ủ đề
Thử sức tại chỗ

Trả lời ngay tại đây

Chưa trả lời câu nào
1SBA301 - Chương 2: React nền tảng — JSX, component, props, Virtual DOMTrung bình
What is ReactJS primarily used for?
2SBA301 - Chương 2: React nền tảng — JSX, component, props, Virtual DOMDễ
What is the benefit of using React's Virtual DOM?
3SBA301 - Chương 2: React nền tảng — JSX, component, props, Virtual DOMTrung bình
Which of the following is a core feature of React?
Còn 3 câu nữa ở trên

Trả lời hết các câu trên để xem tổng kết, hoặc vào phiên học ngay.

Học từ ngân hàng câu hỏi

Bắt đầu một phiên học theo môn

Tiến độ của bạn luôn được tính và đồng bộ trực tiếp theo tổng số lượng câu hỏi mới nhất của môn học này.

171Ngân hàng hiện tại--Tiến độ môn

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

24/171 câuCòn 147
5Which of the following is NOT a valid way to handle events in React?4 lựa chọnDễ71% trả lời đúng
AonClick={handleClick}
BonClick={handleClick()}
ConClick={() => handleClick()}
DonClick={(e) => handleClick(e)}
Lời giải
Trong React, cách xử lý sự kiện được thực hiện bằng cách sử dụng các thuộc tính đặc biệt như onClick, onMouseOver, v.v. Có một số cách để gọi hàm xử lý sự kiện, nhưng không phải tất cả đều hợp lệ. Ví dụ, bạn có thể gọi hàm xử lý sự kiện bằng cách sử dụng biểu thức lambda như onClick={() => handleClick()} hoặc bằng cách truyền tham số vào hàm xử lý sự kiện như onClick={(e) => handleClick(e)}. Tuy nhiên, cách không hợp lệ là gọi hàm xử lý sự kiện ngay lập tức như onClick={handleClick()}.
Mở trang câu hỏi này →
6In JSX, how do you add a JavaScript variable to a rendered element?4 lựa chọnDễ100% trả lời đúng
AUsing double quotes: "variable"
BUsing angle brackets: <variable>
CUsing curly braces: {variable}
DUsing parentheses: (variable)
Lời giải

Trong JSX, để thêm một biến JavaScript vào một phần tử được rendered, bạn cần sử dụng dấu ngoặc nhọn {variable}. Điều này cho phép bạn truy cập vào giá trị của biến và hiển thị nó trong phần tử. Ví dụ:

Lời giải
<div>{
  x
}
</div>

sẽ hiển thị giá trị của biến x. Sử dụng dấu ngoặc nhọn là cách phổ biến và được khuyến khích để thêm biến JavaScript vào JSX.

Mở trang câu hỏi này →
7What does the "responsive" aspect of React-Bootstrap mean?4 lựa chọnDễ100% trả lời đúng
AComponents automatically adjust their appearance based on screen size.
BComponents can only be used on mobile devices.
CComponents require manual adjustment for each screen size.
DComponents primarily handle database interactions.
Lời giải
Khái niệm 'đáp ứng' trong React-Bootstrap ám chỉ khả năng tự động điều chỉnh hình thức của các thành phần dựa trên kích thước màn hình. Điều này có nghĩa là các thành phần sẽ tự động thay đổi kích thước, bố cục và thiết kế để phù hợp với màn hình di động, máy tính bảng hoặc màn hình máy tính để bàn. Điều này giúp đảm bảo trải nghiệm người dùng mượt mà và thống nhất trên mọi thiết bị. Ví dụ, một nút bấm có thể được thiết kế để có kích thước lớn hơn trên màn hình máy tính để bàn và nhỏ hơn trên màn hình di động. Tính năng này giúp giảm thiểu việc phải viết mã thủ công để điều chỉnh kích thước và thiết kế của các thành phần trên mỗi thiết bị.
Mở trang câu hỏi này →
ATo replace JavaScript entirely.
BTo provide pre-built, responsive UI components.
CTo manage server-side logic.
DTo create database queries.
Lời giải
React-Bootstrap thường được sử dụng trong các dự án React vì nó cung cấp các thành phần UI có thể điều chỉnh kích thước và tương tác được. Nó cho phép các nhà phát triển tạo ra các ứng dụng có giao diện người dùng thân thiện và dễ sử dụng. Các thành phần UI được cung cấp bởi React-Bootstrap bao gồm các yếu tố như nút bấm, hộp văn bản, danh sách và nhiều hơn nữa. Điều này giúp giảm thiểu thời gian và công sức cần thiết để xây dựng các ứng dụng React từ đầu.
Mở trang câu hỏi này →
9Which of the following is a React-Bootstrap component?4 lựa chọnTrung bình50% trả lời đúng
A<Button>
B<Service>
C<Router>
D<Data>
Lời giải

Câu hỏi này yêu cầu bạn chọn thành phần React-Bootstrap. Thành phần React-Bootstrap là các thành phần được xây dựng trên cơ sở React và được sử dụng để tạo ra các ứng dụng web có giao diện người dùng thân thiện. Trong các lựa chọn, <Button> là một thành phần React-Bootstrap được sử dụng để tạo ra các nút bấm. <Service> không phải là một thành phần React-Bootstrap, mà có thể là một dịch vụ hoặc một module trong ứng dụng. <Router> là một thành phần trong React Router, không phải là React-Bootstrap. <Data> không phải là một thành phần React-Bootstrap, mà là dữ liệu trong ứng dụng. Vì vậy, câu trả lời đúng là <Button>.

Mở trang câu hỏi này →
10How do you update state in a Functional Component?4 lựa chọnDễ100% trả lời đúng
ABy directly modifying the state variable.
BBy calling this.setState().
CBy calling the setter function returned by useState().
DBy using props.setState().
Lời giải
Trong các thành phần chức năng, việc cập nhật trạng thái được thực hiện thông qua hàm setter được trả về bởi useState(). Hàm useState() được sử dụng để tạo một biến trạng thái và một hàm setter cho biến đó. Khi bạn muốn cập nhật trạng thái, bạn sẽ gọi hàm setter này với giá trị mới. Ví dụ, nếu bạn có một biến trạng thái tên là 'count' và bạn muốn tăng giá trị của nó lên 1, bạn sẽ gọi hàm setter như sau: setCount(count + 1). Điều này sẽ cập nhật giá trị của biến trạng thái 'count' và tự động re-render các phần tử trong giao diện người dùng.
Mở trang câu hỏi này →
AThe component re-renders.
BAn error is thrown.
CThe change is ignored.
DThe component updates, but it is not recommended.
Lời giải
Khi bạn trực tiếp sửa đổi biến trạng thái được trả về bởi useState() trong một thành phần chức năng, thì thay đổi này sẽ bị bỏ qua. Điều này là vì useState() sử dụng một đối tượng trạng thái riêng biệt để lưu trữ giá trị của biến trạng thái. Khi bạn sửa đổi biến trạng thái trực tiếp, bạn không thay đổi giá trị được lưu trữ trong đối tượng trạng thái. Thay vào đó, bạn đang sửa đổi một bản sao của giá trị đó. Vì vậy, khi useState() được gọi lại trong vòng đời của thành phần, nó sẽ trả về giá trị ban đầu, không phải giá trị đã được sửa đổi.
Mở trang câu hỏi này →
Aprops.state.
Bthis.state.
CuseState().
DgetState().
Lời giải

Trong các thành phần lớp (Class Components), trạng thái (state) có thể truy cập thông qua thuộc tính 'this.state'. Đây là cách truy cập trạng thái trong các thành phần lớp, nơi mà trạng thái được lưu trữ trong thuộc tính 'state' của lớp. Ví dụ, nếu bạn có một lớp như sau:

Lời giải
 class MyClass extends React.Component {
  constructor(props) {
    super(props);
    this.state = { count: 0 };
  }

  render() {
    return (
      <div>
        <p>Count: {this.state.count}</p>
        <button onClick={() => this.setState({ count: this.state.count + 1 })}>+</button>
      </div>
    );
  }
}

Thì bạn có thể truy cập trạng thái bằng cách sử dụng 'this.state'. Tuy nhiên, trong các thành phần chức năng (Functional Components), trạng thái được truy cập thông qua hàm 'useState()'.

Mở trang câu hỏi này →
13Which of the following is NOT a valid React hook?4 lựa chọnDễ80% trả lời đúng
AuseState
BuseClass
CuseMemo
DuseEffect
Lời giải
Trong React, có một số hook được sử dụng để quản lý trạng thái và hiệu ứng trong ứng dụng. Các hook phổ biến bao gồm useState, useMemo, useEffect. Tuy nhiên, có một số hook không hợp lệ. Trong câu hỏi này, chúng ta cần xác định hook không hợp lệ. 'useState' và 'useMemo' là hai hook hợp lệ, được sử dụng để quản lý trạng thái và hiệu ứng trong ứng dụng. 'useEffect' cũng là một hook hợp lệ, được sử dụng để thực hiện hành động sau khi render. 'useClass' là một hook không hợp lệ, vì nó không tồn tại trong React. Vì vậy, câu trả lời đúng cho câu hỏi này là 'useClass'.
Mở trang câu hỏi này →
14Which of the following violates the Rules of Hooks?4 lựa chọnKhó33% trả lời đúng
ACalling hooks at the top level of a component
BCalling hooks inside a loop
CUsing multiple useState calls
DCalling hooks in custom hooks
Lời giải
Khi sử dụng React Hooks, chúng ta cần tuân thủ các quy tắc để tránh các lỗi không mong muốn. Một trong những quy tắc quan trọng là không gọi hooks trong các vòng lặp. Ví dụ, nếu bạn có một mảng các giá trị và muốn sử dụng useState để lưu trữ từng giá trị, bạn không nên gọi useState trong vòng lặp. Thay vào đó, bạn nên gọi useState một lần và sử dụng giá trị đó trong vòng lặp. Điều này giúp đảm bảo rằng mỗi lần render, bạn chỉ gọi useState một lần và tránh các vấn đề liên quan đến hiệu suất. Ngoài ra, bạn cũng không nên gọi hooks ở cấp độ cao nhất của một component, vì điều này có thể gây ra các vấn đề liên quan đến hiệu suất và khó debug. Cuối cùng, bạn cũng không nên gọi hooks trong các custom hooks, vì điều này có thể gây ra các vấn đề liên quan đến hiệu suất và khó debug.
Mở trang câu hỏi này →
AuseState
BuseEffect
CuseMemo
DuseCallback
Lời giải
Khi lập trình với React, chúng ta thường gặp phải tình trạng hiệu suất chậm do tính toán tốn kém. Để giải quyết vấn đề này, chúng ta có thể sử dụng một số hook đặc biệt. Trong số đó, hook `useMemo` là một lựa chọn phổ biến.
Mở trang câu hỏi này →
16What is a key advantage of client-side routing?4 lựa chọnDễ100% trả lời đúng
AImproved SEO.
BFaster initial page load times.
CSmoother user experience due to reduced server requests.
DEnhanced server security.
Lời giải
Routing trên phía client là một kỹ thuật giúp cải thiện hiệu suất của ứng dụng web. Một trong những lợi ích chính của client-side routing là nó giúp giảm số lượng yêu cầu đến server. Khi sử dụng client-side routing, ứng dụng web sẽ không cần phải gửi yêu cầu đến server để tải lại trang mới mỗi khi người dùng chuyển đổi giữa các trang. Thay vào đó, ứng dụng sẽ xử lý chuyển đổi trang trên phía client, giảm thiểu số lượng yêu cầu đến server. Điều này giúp cải thiện tốc độ tải trang và mang lại trải nghiệm người dùng mượt mà hơn.
Mở trang câu hỏi này →
AUsing this.props.params.
BUsing useParams() Hook.
CUsing props.match.params.
DUsing context.params.
Lời giải
Để truy cập tham số đường dẫn trong một thành phần được rendered bởi React Router v6, bạn có thể sử dụng Hook useParams(). Hook này được sử dụng để lấy tham số đường dẫn từ URL. Ví dụ, nếu bạn có một đường dẫn như /users/:id, bạn có thể sử dụng useParams() để lấy giá trị của tham số :id. Bạn có thể sử dụng useParams() trong bất kỳ hàm nào của thành phần, chẳng hạn như hàm render hoặc hàm useEffect. Ngoài ra, bạn cũng có thể sử dụng useParams() để lấy tham số đường dẫn từ URL trong hàm useLocation().
Mở trang câu hỏi này →
18How do you define a route parameter in a React Router path?4 lựa chọnTrung bình67% trả lời đúng
AUsing square brackets: [param]
BUsing curly braces: {param}
CUsing a colon: :param
DUsing a question mark: ?param
Lời giải
Để định nghĩa một tham số đường dẫn trong một đường dẫn React Router, bạn cần sử dụng dấu hai chấm (:). Ví dụ, đường dẫn "/users/:id" sẽ nhận một tham số id từ URL. Khi sử dụng tham số đường dẫn, bạn có thể truy cập giá trị của nó trong component bằng cách sử dụng props.match.params. Ví dụ, trong component "/users/:id", bạn có thể sử dụng props.match.params.id để truy cập giá trị của tham số id. Ngoài ra, bạn cũng có thể sử dụng tham số đường dẫn để truyền dữ liệu từ server sang client. Điều này giúp bạn có thể xây dựng ứng dụng web động và linh hoạt hơn.
Mở trang câu hỏi này →
19Which HTTP header is used to specify the content type of a JSON response?4 lựa chọnDễ100% trả lời đúng
AContent-Language
BContent-Encoding
CContent-Type: application/json
DContent-Length
Lời giải
Để xác định loại nội dung của một phản hồi JSON, bạn cần sử dụng tiêu đề HTTP nào?
Mở trang câu hỏi này →
ATo render the React components.
BTo store and process data, and handle API requests.
CTo define client-side routing.
DTo manage local component state.
Lời giải
Trong một ứng dụng React điển hình, vai trò chính của một máy chủ backend là xử lý và lưu trữ dữ liệu, cũng như quản lý các yêu cầu API. Máy chủ backend thường được sử dụng để lưu trữ và xử lý dữ liệu lớn, chẳng hạn như cơ sở dữ liệu, và để xử lý các yêu cầu API từ máy khách. Điều này giúp phân tách logic kinh doanh và logic giao diện người dùng, làm cho ứng dụng dễ dàng bảo trì và mở rộng hơn. Máy chủ backend cũng có thể được sử dụng để thực hiện các tác vụ phức tạp, chẳng hạn như tính toán và phân tích dữ liệu.
Mở trang câu hỏi này →
21What is the primary purpose of HTTP?4 lựa chọnDễ
ATo define CSS styles.
BTo transfer data over the internet, especially between web browsers and servers.
CTo manage database connections.
DTo handle client-side rendering exclusively.
Lời giải
HTTP (Hypertext Transfer Protocol) là một giao thức được sử dụng để truyền tải dữ liệu qua internet, đặc biệt là giữa trình duyệt web và máy chủ. Mục đích chính của HTTP là cung cấp một cách thức để các ứng dụng web giao tiếp với nhau, cho phép truyền tải dữ liệu như văn bản, hình ảnh, âm thanh và các loại dữ liệu khác. HTTP sử dụng các phương thức như GET, POST, PUT và DELETE để thực hiện các hành động như đọc, tạo, cập nhật và xóa dữ liệu. Ngoài ra, HTTP cũng cung cấp các tiêu chuẩn về giao tiếp và truyền tải dữ liệu, giúp đảm bảo rằng dữ liệu được truyền tải một cách an toàn và chính xác.
Mở trang câu hỏi này →
Aasync
Bpromise
Cawait
Dcallback
Lời giải
Trong lập trình JavaScript, khi chúng ta sử dụng async/await để xử lý các tác vụ bất đồng bộ, chúng ta thường gặp một vấn đề là cần phải chờ đợi cho đến khi một tác vụ được hoàn thành trước khi tiếp tục thực hiện các tác vụ khác. Keyword được sử dụng để tạm dừng việc thực hiện của một hàm async cho đến khi một Promise được giải quyết là 'await'. Điều này cho phép chúng ta viết mã dễ đọc và dễ hiểu hơn, đồng thời giảm thiểu sự phức tạp khi xử lý các tác vụ bất đồng bộ.
Mở trang câu hỏi này →
23What is the syntax for creating a new Promise?4 lựa chọnKhó25% trả lời đúng
Anew Promise(callback)
BcreatePromise(callback)
CPromise.create(callback)
DPromise.new(callback)
Lời giải

Để tạo một đối tượng Promise mới trong JavaScript, bạn cần sử dụng từ khóa 'new' trước constructor của Promise. Syntax chính xác là 'new Promise(callback)', nơi callback là một hàm bao gồm hai tham số: resolve và reject. Hàm này sẽ được thực thi khi tạo đối tượng Promise. Trong callback, bạn có thể thực hiện các hành động cần thiết và sử dụng các tham số resolve và reject để quản lý trạng thái của Promise. Ví dụ:

Lời giải
 const promise = new Promise((resolve, reject) => {
    // code here
    resolve('Giải quyết được!');
});

Tóm lại, 'new Promise(callback)' là syntax chính xác để tạo một đối tượng Promise mới trong JavaScript.

Mở trang câu hỏi này →
Đề bài
<Routes> <Route path="/" element={
  <Home />
}
/> <Route path="/about" element={
  <About />
}
/> <Route path="*" element={
  <NotFound />
}
/> </Routes>
ABy using the <NotFound> component.
BBy adding a <Route path="*" element={<NotFound />} /> as the last route.
CBy using the notFound prop on the <Routes> component.
DBy using the useNotFound() hook.
Lời giải

Để xử lý trang 404 Not Found trong React Router, bạn có thể sử dụng <Route path="*" element={ <NotFound /> } /> như một tuyến đường cuối cùng. Điều này cho phép bạn định nghĩa một thành phần <NotFound> để hiển thị khi người dùng truy cập vào một đường dẫn không tồn tại. Ví dụ, nếu bạn thêm <Route path="*" element={ <NotFound /> } /> như một tuyến đường cuối cùng trong danh sách các tuyến đường, thì khi người dùng truy cập vào một đường dẫn không tồn tại, React Router sẽ tự động hiển thị thành phần <NotFound>.

Mở trang câu hỏi này →