Trong JSX, các biểu thức hợp lệ phải tuân theo các quy tắc sau: - Các thẻ HTML phải được viết theo cú pháp mở và đóng đúng. - Các thuộc tính phải được viết theo cú pháp <div class="my-class">. - Các biểu thức JavaScript không được sử dụng trong JSX. - Các biểu thức JSX không được sử dụng trong JavaScript. - Các thẻ không được sử dụng trong JSX. Vậy, trong các lựa chọn trên, chỉ có "<div class="my-class">Hello</div>" là một biểu thức JSX hợp lệ.
Ngân hàng câu hỏi môn 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) là môn học kết hợp ReactJS ở phía client và Spring Boot REST ở phía server. Ngân hàng câu hỏi trắc nghiệm SBA301 có đáp án bao quát trọn bộ chương trình: JSX và component, React Hooks (useState, useEffect, useMemo, useCallback) cùng Rules of Hooks, quản lý state ở functional component và class component, React-Bootstrap, client-side routing với React Router v6 (useParams, route param, trang 404), giao tiếp bất đồng bộ bằng Promise, async/await và Axios, nền tảng HTTP và REST API, Spring Boot REST với @RequestBody, @PathVariable, @RequestParam, tài liệu API bằng Swagger 3 / OpenAPI, kiểm thử với spring-boot-starter-test, JPA và Hibernate (ORM, Slice, phân trang, khoá lạc quan, hbm2ddl, Session và Transaction), MongoDB, Spring Data MongoDB, MongoTemplate, MongoDB Atlas và bảo mật với Spring Security cùng JWT. Tài liệu ôn thi FE dành cho sinh viên FPT University.
Bắt đầu một phiên học theo môn
Tiến độ của bạn sẽ luôn được tính toán 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.
Bạn cần đăng nhập để bắt đầu học từ ngân hàng câu hỏi và lưu tiến độ theo môn.
Đang tải phân bố độ khó.
Để tạo một nhánh mới trong Git, bạn cần sử dụng lệnh 'git branch'. Lệnh này được sử dụng để tạo một nhánh mới từ một điểm cụ thể trong lịch sử commit của dự án. Trong câu hỏi này, bạn cần tạo một nhánh mới có tên là 'feature-login'. Lệnh đúng để tạo nhánh mới là 'git branch feature-login'. Lệnh này sẽ tạo một nhánh mới có tên là 'feature-login' và nó sẽ được tạo từ điểm hiện tại của nhánh hiện tại. Nếu bạn muốn chuyển sang nhánh mới ngay lập tức, bạn cần sử dụng lệnh 'git checkout' sau khi tạo nhánh mớ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.
Các ứng dụng đơn trang (SPAs) có một nhược điểm quan trọng liên quan đến lịch sử và điều hướng của trình duyệt. Khi bạn sử dụng một SPA, trình duyệt không thể lưu lại lịch sử trang web như một trang web truyền thống. Điều này có nghĩa là nếu bạn muốn quay lại trang trước đó, bạn không thể sử dụng tính năng quay lại (back) của trình duyệt. Thay vào đó, bạn phải sử dụng các tính năng riêng của ứng dụng để điều hướng. Một nhược điểm khác là bạn cần cấu hình thủ công để quản lý lịch sử trình duyệt một cách chính xác. Điều này có thể gây khó khăn cho người dùng khi họ muốn quay lại trang trước đó.
Axios là một thư viện JavaScript phổ biến được sử dụng để thực hiện các yêu cầu HTTP trong các ứng dụng JavaScript. Nó cho phép bạn dễ dàng gửi và nhận dữ liệu từ máy chủ bằng cách sử dụng các phương thức HTTP khác nhau như GET, POST, PUT, DELETE, v.v. Axios cung cấp một cách đơn giản và dễ sử dụng để quản lý các yêu cầu HTTP, giúp giảm thiểu thời gian phát triển và tăng hiệu suất của ứng dụng. Ngoài ra, Axios cũng hỗ trợ các tính năng như hủy bỏ yêu cầu, quản lý trạng thái, và xử lý lỗi, giúp bạn có thể xây dựng các ứng dụng web mạnh mẽ và đáng tin cậy.
Trong lập trình React, khi sử dụng các thành phần chức năng (Functional Components), chúng ta có thể truy cập vào giá trị của ngữ cảnh (context) bằng cách sử dụng Hook. Hook là một hàm đặc biệt được sử dụng để truy cập vào các giá trị và hành vi của React. Trong trường hợp này, chúng ta cần sử dụng Hook để truy cập vào giá trị của ngữ cảnh. Có một số lựa chọn cho chúng ta: useProps(), useValue(), useContextValue(), useContext(). Tuy nhiên, chỉ có một trong số đó là đúng. Đó là useContext(). Hook useContext() cho phép chúng ta truy cập vào giá trị của ngữ cảnh và sử dụng nó trong thành phần chức năng của mình.
Để cập nhật trạng thái trong một Component lớp, chúng ta có thể sử dụng phương thức setState(). Phương thức này cho phép cập nhật trạng thái của Component một cách an toàn và hiệu quả. Khi sử dụng setState(), Component sẽ được cập nhật ngay lập tức và trạng thái mới sẽ được lưu trữ trong bộ nhớ đệm. Sau đó, trạng thái mới sẽ được cập nhật vào bộ nhớ chính trong vòng đời của Component. Điều này giúp đảm bảo rằng trạng thái của Component luôn được cập nhật một cách đồng bộ và chính xác.
Trong React, để truyền props từ cha sang con, chúng ta sử dụng cú pháp đặc biệt. Câu trả lời đúng là <Child prop=value />, trong đó prop là tên của thuộc tính và value là giá trị mà chúng ta muốn truyền. Ví dụ, nếu chúng ta muốn truyền một chuỗi 'Xin chào' sang một thành phần con, chúng ta sẽ sử dụng cú pháp <Child message='Xin chào' />. Khi đó, thành phần con có thể sử dụng props để truy cập vào giá trị 'Xin chào'. Điều này giúp chúng ta dễ dàng chia sẻ dữ liệu giữa các thành phần trong ứng dụng React.
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: 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()'.
HTTP phương thức idempotent là phương thức có thể thực hiện nhiều lần mà không gây ra tác động khác biệt. Trong các phương thức HTTP, phương thức GET và PUT được coi là idempotent. Phương thức GET được sử dụng để lấy dữ liệu từ server, trong khi phương thức PUT được sử dụng để cập nhật dữ liệu trên server. Vì cả hai phương thức này đều không gây ra tác động khác biệt khi thực hiện nhiều lần, nên chúng được coi là idempotent. Ví dụ, nếu bạn thực hiện GET nhiều lần để lấy dữ liệu, bạn sẽ nhận được dữ liệu giống nhau mỗi lần. Tương tự, nếu bạn thực hiện PUT nhiều lần để cập nhật dữ liệu, dữ liệu sẽ được cập nhật một lần duy nhất. Điều này giúp đảm bảo tính toàn vẹn và ổn định của dữ liệu trên server.
Các ứng dụng một trang (SPAs) thường thực hiện nhiều xử lý trên phía client, điều này làm tăng nguy cơ tấn công Cross-Site Scripting (XSS). XSS là một loại tấn công web mà kẻ tấn công có thể thực hiện mã độc trên trang web của nạn nhân, khiến nạn nhân thực hiện các hành động không mong muốn. Các ứng dụng một trang thường sử dụng JavaScript để thực hiện các hành động trên phía client, và nếu mã JavaScript bị tấn công, kẻ tấn công có thể thực hiện các hành động độc hại như sao chép dữ liệu, thực hiện các giao dịch không mong muốn, v.v. Vì vậy, các nhà phát triển cần phải chú ý đến việc bảo mật mã JavaScript của mình để tránh các tấn công XSS.
Swagger 3 (OpenAPI 3) là một tiêu chuẩn mở cho việc mô tả API. Để viết các đặc tả này, chúng ta có thể sử dụng hai định dạng file là JSON và YAML. JSON (JavaScript Object Notation) là một định dạng file phổ biến được sử dụng để lưu trữ và truyền tải dữ liệu. YAML (YAML Ain't Markup Language) là một định dạng file khác được sử dụng để lưu trữ và truyền tải dữ liệu. Cả hai định dạng file này đều có thể được sử dụng để viết các đặc tả Swagger 3. XML và CSV không phải là định dạng file được hỗ trợ bởi Swagger 3. HTML cũng không phải là định dạng file được hỗ trợ bởi Swagger 3. Vì vậy, đáp án đúng cho câu hỏi này là JSON hoặc YAML.
Để thay đổi mặc định địa chỉ OpenAPI endpoint trong ứng dụng Spring, bạn cần sử dụng thuộc tính cấu hình Spring. Trong các lựa chọn trên, thuộc tính "springdoc.api-docs.path" là lựa chọn đúng. Nó cho phép bạn thay đổi địa chỉ mặc định của OpenAPI endpoint, giúp bạn có thể tùy chỉnh và quản lý API của mình một cách linh hoạt hơn. Ví dụ, bạn có thể sử dụng thuộc tính này để thay đổi địa chỉ OpenAPI endpoint thành một địa chỉ khác, chẳng hạn như "/api/docs" hoặc "/swagger".
Trong khi khởi tạo một thành phần Class Component, bạn cần phải sử dụng hàm constructor() để khởi tạo trạng thái ban đầu của component. Hàm constructor() được gọi khi component được tạo mới và nó được sử dụng để khởi tạo trạng thái của component. Bạn có thể sử dụng từ khóa 'this.state' để truy cập vào trạng thái của component và gán giá trị cho nó. Ví dụ: constructor(props) { super(props); this.state = { trạng_thái: 'giá_trị' }; }. Điều này giúp bạn có thể truy cập và sử dụng trạng thái trong các phương thức khác của component.
Khi sử dụng JUnit 5, annotation thường được sử dụng cùng với @SpringBootTest là @ExtendWith(SpringExtension.class). Annotation này cho phép JUnit 5 sử dụng Spring Boot để chạy các test. Nó giúp tạo ra một môi trường thử nghiệm đầy đủ cho ứng dụng Spring Boot, bao gồm cả các tính năng như autowiring và dependency injection. Điều này cho phép các nhà phát triển viết các test đơn giản và hiệu quả hơn. Ngoài ra, @ExtendWith(SpringExtension.class) cũng giúp giảm thiểu số lượng mã cần thiết để cấu hình môi trường thử nghiệm.