Danh sách câu hỏi của đề

Câu hỏi: HSF302 Làm việc với Spring Framework – Bộ ôn tập cuối kỳ số 3

50 câu trắc nghiệm kèm lời giải của môn HSF302 - Làm việc với Spring Framework, xếp đúng thứ tự trong đề.

Danh sách câu hỏi

20/50 câuCòn 30
AIt returns an HTML page
BIt converts the return value to JSON or XML
CIt binds request parameters
DIt sets the HTTP status code
Lời giải
Đáp án đúng: "It converts the return value to JSON or XML". Khi một phương thức handler có @ResponseBody, Spring MVC không coi giá trị trả về là tên view nữa mà đưa nó qua HttpMessageConverter phù hợp với header Accept và thư viện có trong classpath để ghi thẳng vào thân phản hồi HTTP, ví dụ đối tượng Java thành JSON nhờ Jackson hoặc thành XML nếu có bộ chuyển XML; @RestController chính là @Controller cộng @ResponseBody cho mọi phương thức. "It returns an HTML page" mô tả hành vi ngược lại, tức handler không có @ResponseBody trả về tên view để ViewResolver render template HTML. "It binds request parameters" là việc của @RequestParam, @PathVariable hay @ModelAttribute. "It sets the HTTP status code" là việc của @ResponseStatus hoặc ResponseEntity, @ResponseBody không đổi mã trạng thái.
Mở trang câu hỏi này →
AA web templating engine
BA library for UI development
CA JPA implementation that simplifies ORM
DA Java compiler extension
Lời giải
Đáp án đúng: "A JPA implementation that simplifies ORM". Hibernate là framework ORM (Object Relational Mapping, ánh xạ đối tượng sang quan hệ) cho Java và là hiện thực JPA phổ biến nhất, cũng là persistence provider mặc định của Spring Boot khi dùng spring-boot-starter-data-jpa; nó ánh xạ lớp thực thể thành bảng, tự sinh SQL, quản lý persistence context, lazy loading và bộ đệm, giúp lập trình viên thao tác đối tượng thay vì viết JDBC thủ công. "A web templating engine" mô tả Thymeleaf hoặc FreeMarker, những công cụ sinh trang HTML. "A library for UI development" mô tả JavaFX hay Swing, không liên quan tầng dữ liệu. "A Java compiler extension" sai vì Hibernate là thư viện chạy lúc runtime, không mở rộng trình biên dịch; dù có công cụ sinh metamodel lúc biên dịch, đó không phải bản chất của nó.
Mở trang câu hỏi này →
AStage
BScene
CNode
DPane
Lời giải
Đáp án đúng: "Scene". Trong JavaFX, Scene là vùng chứa toàn bộ nội dung của scene graph (đồ thị cảnh): nó giữ một nút gốc, thường là một Pane, và mọi Button, Label, hình vẽ đều nằm dưới nút gốc đó. "Stage" là cửa sổ cấp cao nhất do hệ điều hành cung cấp; nó bao ngoài và chứa Scene qua setScene chứ không trực tiếp chứa các nút giao diện, đổi Scene là đổi toàn bộ nội dung trong cùng một cửa sổ. "Node" là lớp cơ sở của từng phần tử trong scene graph, mỗi node chỉ là một mảnh nội dung chứ không phải vùng chứa tất cả. "Pane" là một node bố cục có thể chứa các node con và hay được dùng làm nút gốc, nhưng nó chỉ chứa phần nội dung đặt trong nó và bản thân vẫn phải nằm trong một Scene mới hiển thị được.
Mở trang câu hỏi này →
Đề bài
public String index() {
    return "home";
}
ARenders the "home.html" page directly
BReturns plain text "home"
CRedirects to "/home"
DResolves "home" as a view name using ViewResolver
Lời giải
Đáp án đúng: "Resolves "home" as a view name using ViewResolver". Trong một @Controller thường, phương thức trả về String mà không có @ResponseBody thì chuỗi đó được hiểu là tên view logic; DispatcherServlet chuyển tên home cho ViewResolver, ví dụ ThymeleafViewResolver ghép tiền tố classpath:/templates/ và hậu tố .html để tìm template, rồi View mới render ra HTML. "Renders the "home.html" page directly" sai ở chữ trực tiếp: controller không tự mở tệp nào, mọi việc phải qua bước phân giải view, và tên tệp thật phụ thuộc cấu hình resolver. "Returns plain text "home"" chỉ đúng khi có @ResponseBody hoặc lớp là @RestController. "Redirects to "/home"" chỉ xảy ra khi chuỗi trả về có tiền tố redirect:, như redirect:/home.
Mở trang câu hỏi này →
AThe table of the first entity.
BThe table of the second entity.
CA join table.
DA temporary table.
Lời giải
Đáp án đúng: "A join table.". Quan hệ nhiều nhiều không thể biểu diễn bằng một cột khoá ngoại ở bảng nào, vì mỗi dòng bên này ứng với nhiều dòng bên kia và ngược lại; JPA vì thế dùng một bảng nối (join table) chứa hai cột khoá ngoại trỏ tới khoá chính của hai entity, ví dụ bảng student_course gồm student_id và course_id, mô tả bằng @ManyToMany kèm @JoinTable với joinColumns và inverseJoinColumns. "The table of the first entity." không làm được vì một cột chỉ chứa một giá trị khoá ngoại, không lưu được nhiều liên kết cho cùng một dòng. "The table of the second entity." gặp đúng vấn đề đó theo chiều ngược lại. "A temporary table." chỉ tồn tại trong phiên làm việc hoặc giao dịch rồi biến mất, không giữ được quan hệ lâu dài.
Mở trang câu hỏi này →
Ath:if
Bth:each
Cth:text
Dth:href
Lời giải
Đáp án đúng: "th:each". Thuộc tính th:each của Thymeleaf lặp qua một tập hợp như List, mảng hay Map và lặp lại phần tử HTML chứa nó cho mỗi phần tử, ví dụ đặt th:each với biểu thức s : ${students} trên thẻ tr sẽ sinh một dòng bảng cho mỗi sinh viên, kèm biến trạng thái cho chỉ số và số đếm. "th:if" chỉ hiển thị phần tử khi biểu thức đúng, là điều kiện chứ không phải vòng lặp. "th:text" thay nội dung văn bản của phần tử bằng giá trị biểu thức, có thoát ký tự HTML. "th:href" tính giá trị thuộc tính href, thường kèm cú pháp liên kết @{...} để dựng URL đúng context path. Muốn hiển thị danh sách thì dùng th:each bao ngoài, rồi th:text bên trong cho từng giá trị.
Mở trang câu hỏi này →
ATo provide a database management system.
BTo offer a comprehensive infrastructure support for developing Java applications.
CTo create graphical user interfaces.
DTo manage operating system resources.
Lời giải
Đáp án đúng: "To offer a comprehensive infrastructure support for developing Java applications.". Spring Framework là nền tảng cung cấp hạ tầng toàn diện cho ứng dụng Java: lõi IoC container và Dependency Injection, AOP, quản lý giao dịch, truy cập dữ liệu, Spring MVC cho web, hỗ trợ kiểm thử; nhờ vậy lập trình viên tập trung vào logic nghiệp vụ còn phần hạ tầng lặp lại do framework lo. "To provide a database management system." sai vì Spring không phải hệ quản trị cơ sở dữ liệu, nó chỉ kết nối tới MySQL, PostgreSQL qua JDBC hay JPA. "To create graphical user interfaces." là việc của JavaFX hay Swing; Spring có thể đứng sau một ứng dụng giao diện nhưng không phải bộ công cụ vẽ giao diện. "To manage operating system resources." là việc của hệ điều hành, Spring chạy trên JVM và không quản lý tài nguyên hệ điều hành.
Mở trang câu hỏi này →
AApache Tomcat
BJetty
CUndertow
DAll of the above
Lời giải
Đáp án đúng: "All of the above". Trong các bản Spring Boot 2.x và 3.x, ứng dụng servlet được hỗ trợ sẵn ba web server nhúng (embedded server): thêm spring-boot-starter-web thì mặc định là Tomcat, và có thể loại Tomcat ra rồi thêm starter tương ứng để đổi sang Jetty hoặc Undertow; server chạy ngay trong tiến trình khi khởi động ứng dụng từ tệp jar, không cần cài server ngoài. "Apache Tomcat" đúng nhưng chỉ là lựa chọn mặc định, chọn riêng nó bỏ sót hai server kia. "Jetty" là server nhúng nhẹ của Eclipse, được hỗ trợ qua spring-boot-starter-jetty, nhưng cũng chỉ là một phần của danh sách. "Undertow" là server hiệu năng cao của Red Hat, hỗ trợ qua spring-boot-starter-undertow, cũng chưa đủ. Vì câu hỏi liệt kê các server nhúng nên chọn đáp án bao gồm cả ba.
Mở trang câu hỏi này →
AIt tightly couples the components
BIt reduces testability of code
CIt promotes loose coupling between components
DIt is required only for web apps
Lời giải
Đáp án đúng: "It promotes loose coupling between components". Dependency Injection (tiêm phụ thuộc) nghĩa là đối tượng không tự new các phụ thuộc mà được IoC container của Spring đưa vào qua constructor, setter hoặc trường; lớp chỉ phụ thuộc vào interface nên có thể thay hiện thực khác mà không sửa mã, đó chính là liên kết lỏng (loose coupling). "It tightly couples the components" nói ngược bản chất, liên kết chặt là tình trạng lớp tự tạo phụ thuộc cụ thể, thứ DI loại bỏ. "It reduces testability of code" cũng ngược lại: nhờ phụ thuộc được truyền từ ngoài, khi kiểm thử đơn vị ta dễ đưa vào mock hoặc stub thay cho cơ sở dữ liệu hay dịch vụ thật. "It is required only for web apps" sai vì DI là cơ chế của Spring Core, dùng cho mọi loại ứng dụng từ ứng dụng dòng lệnh, ứng dụng desktop tới dịch vụ web, và không phải yêu cầu riêng của ứng dụng web.
Mở trang câu hỏi này →
10Which method launches a JavaFX app?4 lựa chọn
Amain()
Bstart()
Claunch()
Drun()
Lời giải
Đáp án đúng: "launch()". Phương thức tĩnh Application.launch() là thứ khởi động một ứng dụng JavaFX: nó dựng runtime JavaFX, tạo một thể hiện của lớp con Application, gọi init() rồi gọi start(Stage) trên luồng JavaFX Application Thread với Stage chính đã được tạo sẵn, và chỉ trả về khi ứng dụng thoát. "main()" là điểm vào của JVM; trong ứng dụng JavaFX, main thường chỉ có một dòng gọi launch(args), tự nó không khởi động bộ công cụ đồ hoạ. "start()" là phương thức trừu tượng mà lập trình viên ghi đè để dựng Scene, nó được runtime gọi sau khi launch chạy chứ người lập trình không gọi trực tiếp để khởi động ứng dụng. "run()" là phương thức của Runnable hay Thread, dùng cho luồng thông thường hoặc Platform.runLater, không phải cách khởi chạy ứng dụng JavaFX.
Mở trang câu hỏi này →
ADatabase connectivity.
BWeb application development.
CSecurity configuration.
DMessaging.
Lời giải
Đáp án đúng: "Web application development.". spring-boot-starter-web là starter POM (gói phụ thuộc khởi đầu) gom sẵn Spring MVC, Jackson để chuyển đổi JSON và Tomcat nhúng, đủ để viết ứng dụng web và REST API chỉ với một phụ thuộc; auto-configuration sẽ tự dựng DispatcherServlet và máy chủ nhúng khi thấy các thư viện này trên classpath. "Database connectivity." sai vì kết nối cơ sở dữ liệu đến từ spring-boot-starter-data-jpa hoặc spring-boot-starter-jdbc. "Security configuration." sai vì bảo mật có starter riêng là spring-boot-starter-security. "Messaging." sai vì nhắn tin dùng các starter như spring-boot-starter-amqp cho RabbitMQ hay thư viện spring-kafka, không nằm trong starter web.
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 →
ATo define database connections.
BTo map HTTP requests to specific controller methods.
CTo define user interfaces.
DTo configure application security.
Lời giải
Đáp án đúng: "To map HTTP requests to specific controller methods.". @RequestMapping khai báo URL, phương thức HTTP, tham số, header hay kiểu nội dung mà một lớp hoặc phương thức controller xử lý; khi khởi động, RequestMappingHandlerMapping quét các annotation này để lập bảng ánh xạ, và lúc chạy DispatcherServlet dùng bảng đó để chọn đúng phương thức. Các annotation @GetMapping, @PostMapping chỉ là dạng rút gọn của nó. "To define database connections." sai vì kết nối cơ sở dữ liệu cấu hình qua DataSource và các thuộc tính spring.datasource. "To define user interfaces." sai vì giao diện nằm ở template như Thymeleaf, còn annotation này chỉ định tuyến yêu cầu. "To configure application security." sai vì phân quyền theo URL được cấu hình trong SecurityFilterChain của Spring Security; @RequestMapping không kiểm tra ai được truy cập.
Mở trang câu hỏi này →
14Which 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 →
ATo define a standard for web application development
BTo define a standard for object-relational mapping in Java
CTo manage user interfaces
DTo handle network communication
Lời giải
Đáp án đúng: "To define a standard for object-relational mapping in Java". Mục đích chính của JPA (Java Persistence API) là đưa ra một chuẩn chung cho ORM, tức ánh xạ đối tượng Java sang bảng quan hệ: đặc tả quy định annotation như @Entity, @Table, @Id, giao diện EntityManager, vòng đời thực thể và ngôn ngữ truy vấn JPQL, còn các nhà cung cấp như Hibernate hay EclipseLink hiện thực chuẩn đó, nên mã viết theo JPA có thể đổi nhà cung cấp mà ít phải sửa. "To define a standard for web application development" là phạm vi của Servlet, Jakarta EE web hay Spring MVC, không phải JPA. "To manage user interfaces" là việc của JavaFX, Swing hay tầng view. "To handle network communication" thuộc về socket, HTTP client hay RMI, không liên quan tới lưu trữ dữ liệu.
Mở trang câu hỏi này →
AMaps POST requests
BMaps GET requests to /list
CDenotes a view name
DDisables route
Lời giải
Đáp án đúng: "Maps GET requests to /list". @GetMapping là dạng rút gọn của @RequestMapping(method = RequestMethod.GET); đặt @GetMapping("/list") lên một phương thức trong controller nghĩa là DispatcherServlet sẽ chuyển mọi yêu cầu HTTP GET tới đường dẫn /list (cộng với tiền tố @RequestMapping ở cấp lớp nếu có) cho phương thức đó xử lý, thường để hiển thị danh sách. "Maps POST requests" là vai trò của @PostMapping, dùng khi gửi form hay tạo mới dữ liệu. "Denotes a view name" sai vì chuỗi /list là đường dẫn URL; tên view là giá trị phương thức trả về, chẳng hạn chuỗi product-list để ViewResolver tìm template. "Disables route" sai vì annotation này đăng ký thêm một route chứ không tắt route nào; Spring không có annotation mapping dùng để vô hiệu hoá đường dẫn.
Mở trang câu hỏi này →
A@ExceptionHandler methods handle exceptions across all controllers by default; @ControllerAdvice limits them to one controller
B@ExceptionHandler only works with REST controllers; @ControllerAdvice only with MVC controllers
C@ExceptionHandler in a controller handles exceptions for that controller; @ControllerAdvice can apply such handlers globally
DBoth are deprecated in favor of filters
Lời giải

Đáp án đúng: "@ExceptionHandler in a controller handles exceptions for that controller; @ControllerAdvice can apply such handlers globally". Phương thức @ExceptionHandler khai báo trong một controller chỉ bắt ngoại lệ ném ra từ các handler của chính controller đó; muốn dùng chung cho nhiều controller, ta đặt các phương thức @ExceptionHandler vào một lớp @ControllerAdvice hoặc @RestControllerAdvice, và mặc định lớp này áp cho mọi controller, có thể thu hẹp bằng basePackages hay assignableTypes. Phát biểu "handle exceptions across all controllers by default; @ControllerAdvice limits them to one controller" nói ngược hoàn toàn vai trò của hai annotation. Phát biểu "only works with REST controllers; @ControllerAdvice only with MVC controllers" sai vì cả hai dùng được cho controller trả view lẫn controller REST. "Both are deprecated in favor of filters" sai vì cả hai vẫn là cơ chế chính thức trong Spring hiện nay; filter chạy trước DispatcherServlet nên không thay được việc xử lý ngoại lệ ở tầng handler.

Mở trang câu hỏi này →
AServlet
BEntityManager
CJSP
DJDBC Driver
Lời giải
Đáp án đúng: "EntityManager". EntityManager là giao diện trung tâm của JPA, gắn với một persistence context (ngữ cảnh lưu trữ) là tập các entity đang được quản lý; qua nó ta gọi persist để đưa entity mới vào quản lý, find để nạp theo khoá chính, merge để gộp entity tách rời, remove để xoá và createQuery để chạy JPQL, còn thay đổi trên entity managed được tự động đồng bộ xuống cơ sở dữ liệu khi flush hoặc commit. "Servlet" là thành phần web của Jakarta EE xử lý yêu cầu HTTP, không biết gì về entity. "JSP" là công nghệ trang hiển thị phía máy chủ, thuộc tầng view. "JDBC Driver" là trình điều khiển cấp thấp để gửi câu SQL tới một hệ quản trị cụ thể; JPA provider như Hibernate dùng nó bên dưới, nhưng driver không theo dõi trạng thái entity.
Mở trang câu hỏi này →
ADatabase drivers.
BHTML attributes and elements.
CSecurity protocols.
DNetwork configurations.
Lời giải
Đáp án đúng: "HTML attributes and elements.". Standard Dialect (phương ngữ chuẩn) của Thymeleaf là bộ processor định nghĩa các thuộc tính như th:text, th:each, th:if, th:href và phần tử như th:block, cùng cú pháp biểu thức chuẩn ${...}, *{...}, #{...}, @{...}; nhờ chúng mà tệp HTML vẫn mở được bằng trình duyệt như một bản mẫu tĩnh nhưng khi Thymeleaf xử lý thì được thay bằng dữ liệu thật. "Database drivers." là trình điều khiển JDBC để kết nối cơ sở dữ liệu, thuộc tầng truy cập dữ liệu chứ không thuộc engine template. "Security protocols." như TLS hay OAuth do tầng bảo mật như Spring Security đảm nhận, Thymeleaf chỉ có dialect bổ sung riêng để đọc thông tin bảo mật. "Network configurations." không liên quan, Thymeleaf chỉ sinh nội dung giao diện.
Mở trang câu hỏi này →
Đề bài
<a th:href="______">Home</a>
A${/home}
B#{/home}
C@{/home}
D~{/home}
Lời giải
Đáp án đúng: "@{/home}". Trong cú pháp biểu thức chuẩn của Thymeleaf, @{...} là biểu thức URL liên kết (link URL expression): với đường dẫn bắt đầu bằng dấu gạch chéo, Thymeleaf tự thêm context path của ứng dụng, cho phép truyền tham số như @{/home(id=${id})} và mã hoá URL, nên th:href="@{/home}" sinh ra liên kết đúng dù ứng dụng chạy ở đường dẫn gốc nào. "${/home}" là biểu thức biến, dùng để đọc thuộc tính trong model, còn /home không phải tên biến hợp lệ. "#{/home}" là biểu thức thông điệp, dùng để tra khoá trong tệp messages cho đa ngôn ngữ. "~{/home}" là biểu thức fragment, dùng với th:insert hoặc th:replace để chèn một mảnh template, không tạo đường dẫn liên kết.
Mở trang câu hỏi này →