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ệ.
Tích hợp ứng dụng trang đơn với Spring Boot - Integrate single page application with Spring Boot
Chủ đề học tập
SBA301 - Chương 10: Bảo mật ứng dụng — Basic Auth, session và JWT
Xác thực và phân quyền cho dịch vụ REST bằng Spring Security. Phần Basic Authentication gồm định dạng header Authorization với base64 của tên đăng nhập và mật khẩu, phản hồi 401 kèm header WWW-Authenticate để trình duyệt bật hộp thoại đăng nhập, tính phi trạng thái và giới hạn an toàn của nó so với OAuth2. Phần phiên làm việc gồm header Cookie mang mã phiên và HttpSession.invalidate để huỷ phiên cùng toàn bộ thuộc tính. Phần JWT gồm vai trò của header trong token và trình tự các bước triển khai.
SBA301 - Chương 11: Kiểm thử ứng dụng Spring Boot
Kiểm thử ứng dụng tích hợp: phân biệt kiểm thử đơn vị với kiểm thử tích hợp, gói spring-boot-starter-test, annotation SpringBootTest cùng tham số webEnvironment. RANDOM_PORT khởi động máy chủ nhúng trên cổng ngẫu nhiên và là điều kiện để tiêm TestRestTemplate, DEFINED_PORT dùng khi cần gọi HTTP thật vào cổng đã định, còn WebMvcTest chỉ nạp tầng web cho nhẹ. Kèm ExtendWith với SpringExtension khi chạy trên JUnit 5.
SBA301 - Chương 1: Kiến trúc SPA và tích hợp với Spring Boot
Tổng quan ứng dụng trang đơn (Single Page Application) và cách nó ghép với backend Spring Boot: vì sao SPA chuyển trang nhanh hơn sau lần tải đầu, đánh đổi ở lần tải đầu tiên, cách SPA giảm tải cho máy chủ nhờ đẩy việc định tuyến và dựng giao diện xuống trình duyệt. Kèm những điểm phải tự xử lý mà trang truyền thống được sẵn: lịch sử duyệt web, công cụ phân tích như Google Analytics, và rủi ro bảo mật XSS do xử lý nặng phía client. Có cả vai trò của HTTP và của máy chủ backend trong kiến trúc này.
SBA301 - Chương 2: React nền tảng — JSX, component, props, Virtual DOM
Những viên gạch đầu tiên của React: JSX là phần mở rộng cú pháp của JavaScript, cách nhúng biến bằng dấu ngoặc nhọn, cách truyền props từ component cha xuống con và trả dữ liệu ngược lên bằng hàm callback. Giải thích Virtual DOM và vì sao nó giúp cập nhật giao diện nhanh hơn thao tác trực tiếp lên DOM thật, vai trò của key trong danh sách, React Fragment để gói nhiều phần tử mà không sinh thêm nút DOM, kết xuất có điều kiện, cùng bộ component dựng sẵn React-Bootstrap và ý nghĩa của responsive.
SBA301 - Chương 3: State và Hooks trong React
Quản lý trạng thái trong component hàm: useState trả về giá trị và hàm cập nhật, vì sao sửa thẳng biến state thì React bỏ qua, useEffect thay cho componentDidMount để chạy tác dụng phụ và ý nghĩa của mảng phụ thuộc. Bao gồm useMemo để ghi nhớ kết quả tính toán tốn kém, useReducer, phân biệt hook hợp lệ với tên bịa, Rules of Hooks (không gọi hook trong vòng lặp hay nhánh điều kiện), component có kiểm soát, kỹ thuật nâng state lên tổ tiên chung gần nhất, và cách đọc state trong component lớp.
SBA301 - Chương 4: React Router — điều hướng phía client
Định tuyến trong ứng dụng React bằng react-router-dom: bọc toàn bộ route trong Router hoặc BrowserRouter, khai báo tham số đường dẫn bằng dấu hai chấm và đọc nó bằng hook useParams. Trình bày component Outlet cho route lồng nhau, vai trò của Switch trong bản v5 là kết xuất route khớp đầu tiên, cách bắt trang 404 bằng route dấu sao đặt cuối cùng, và vì sao định tuyến phía client cho trải nghiệm mượt hơn nhờ giảm số lần gọi về máy chủ.
SBA301 - Chương 5: Gọi API từ client — fetch, Axios và Promise
Cách phía React lấy dữ liệu từ dịch vụ REST: hàm fetch trả về Promise, mặc định dùng phương thức GET, và chuỗi xử lý đúng là then lấy response rồi gọi response.json(). Phần Axios gồm axios.get và axios.post, đặt địa chỉ gốc bằng axios.defaults.baseURL, bắt lỗi bằng catch, các phương thức HTTP mà Axios hỗ trợ, và chọn put hay patch khi cập nhật tài nguyên. Kèm nền tảng bất đồng bộ của JavaScript: khởi tạo Promise và từ khoá await.
SBA301 - Chương 6: Spring Boot REST — annotation và xử lý request, response
Xây dựng dịch vụ REST bằng Spring Boot: GetMapping và PostMapping để ánh xạ phương thức HTTP, RequestParam cho tham số truy vấn, PathVariable cho biến đường dẫn, RequestHeader cho header tuỳ ý, RequestBody để chuyển thân yêu cầu thành đối tượng Java. Giải thích RestController đã bao hàm ResponseBody cho mọi phương thức, cách ấn định mã trạng thái bằng ResponseStatus, ResponseEntity để tự do đặt thân, mã trạng thái và header, ràng buộc kiểu dữ liệu qua consumes và produces, cùng lựa chọn giữa PUT và PATCH.
SBA301 - Chương 7: Truy cập dữ liệu quan hệ với JPA và Hibernate
Lớp ánh xạ đối tượng - quan hệ trong Spring Boot: JPA che phần JDBC thủ công, Hibernate với tệp cấu hình hibernate.cfg.xml và thẻ mapping resource trỏ tới tệp ánh xạ lớp Java sang bảng, giao diện Transaction để quản lý giao dịch, tính năng hbm2ddl tự sinh lược đồ. Kèm khoá lạc quan (optimistic locking) chống xung đột khi ghi đồng thời, phương thức truy vấn suy diễn từ tên hàm trong Spring Data JPA, và thời điểm nên dùng Slice thay cho Page để khỏi đếm toàn bộ bản ghi.
SBA301 - Chương 8: MongoDB và Spring Data MongoDB
Làm việc với cơ sở dữ liệu tài liệu: lược đồ linh hoạt cho phép các tài liệu trong cùng collection có tập trường khác nhau, các lệnh shell như find, insertOne, createIndex, phép nối $lookup và projection để chỉ lấy trường cần. Phía Spring Boot gồm gói khởi tạo spring-boot-starter-data-mongodb, thuộc tính spring.data.mongodb.database, annotation Document và DBRef, giao diện MongoRepository cho CRUD và lớp MongoTemplate cùng Criteria cho truy vấn phức tạp. Có thêm chỉ mục duy nhất, chỉ mục ghép, replica set và MongoDB Atlas.
SBA301 - Chương 9: Tài liệu hoá API với OpenAPI và Swagger
Sinh tài liệu sống cho dịch vụ REST bằng Springdoc OpenAPI 3: thư viện springdoc-openapi-ui, thuộc tính springdoc.api-docs.path để đổi đường dẫn mặc định, annotation Tag để gom nhóm endpoint trong Swagger UI, ApiResponses và ApiResponse để mô tả từng mã trạng thái trả về như 200 hay 404, RequestBody của gói swagger để mô tả nội dung thân yêu cầu, và annotation Hidden để giấu endpoint khỏi tài liệu. Kèm những thành phần thường thấy trong một bản tài liệu REST và thứ không thuộc về nó.
Đề thi trắc nghiệm
Xem tất cảSBA301
Tích hợp ứng dụng trang đơn với Spring Boot - Integrate single page application with Spring Boot
SBA301 - Đề thi cuối kỳ SU26 #777 (48 câu)
SBA301
Tích hợp ứng dụng trang đơn với Spring Boot - Integrate single page application with Spring Boot
SBA301 - Bộ ôn thi cuối kỳ 84 câu
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ó.
Ngân hàng câu hỏi
Xem trước · Cuộn vô hạnĐể 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.