Ngân hàng câu hỏi của chương

Câu hỏi: HSF302 - Phần 5: Spring MVC và REST controller

30 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 theo thứ tự nhập vào ngân hàng.

Danh sách câu hỏi

20/30 câuCòn 10
ATo manage database connections.
BTo process user requests and return a model and view.
CTo define user interfaces.
DTo configure application security.
Lời giải
Đáp án đúng: "To process user requests and return a model and view.". Trong Spring MVC, DispatcherServlet nhận yêu cầu HTTP rồi chuyển cho phương thức xử lý (handler) nằm trong lớp gắn @Controller; phương thức này đọc tham số, gọi tầng service, đặt dữ liệu vào Model và trả về tên view logic (hoặc một ModelAndView) để ViewResolver tìm template hiển thị, đúng vai trò bộ điều khiển trong mô hình Model–View–Controller. "To manage database connections." là việc của DataSource và bể kết nối như HikariCP, controller chỉ gọi gián tiếp qua service và repository. "To define user interfaces." thuộc về tầng View, tức các template Thymeleaf hay JSP, controller không mô tả giao diện. "To configure application security." do Spring Security đảm nhận qua chuỗi filter và bean cấu hình SecurityFilterChain, chạy trước khi yêu cầu tới controller.
Mở trang câu hỏi này →
A@PathVariable binds a query parameter; @RequestParam binds a URI template variable
B@PathVariable binds a URI template variable; @RequestParam binds a query parameter or form field
CBoth only bind data from HTTP headers
DBoth require a ModelAndView return type
Lời giải
Đáp án đúng: "@PathVariable binds a URI template variable; @RequestParam binds a query parameter or form field". Với ánh xạ @GetMapping("/users/{id}"), @PathVariable lấy giá trị của biến mẫu id nằm ngay trong đường dẫn, ví dụ /users/42 cho id bằng 42; còn @RequestParam đọc tham số truy vấn sau dấu hỏi như /users?page=2, và với Servlet API thì cũng đọc được trường của form gửi lên dạng application/x-www-form-urlencoded. "@PathVariable binds a query parameter; @RequestParam binds a URI template variable" đảo ngược đúng hai vai trò này. "Both only bind data from HTTP headers" sai vì đọc header là việc của @RequestHeader, còn hai annotation được hỏi đọc dữ liệu từ URI và tham số yêu cầu. "Both require a ModelAndView return type" sai vì kiểu trả về của phương thức xử lý độc lập với cách gắn tham số: có thể trả String tên view, đối tượng được chuyển thành JSON trong @RestController, ResponseEntity hay void.
Mở trang câu hỏi này →
3Which object holds model data?4 lựa chọn
AModel
BEntity
CView
DContext
Lời giải
Đáp án đúng: "Model". Trong Spring MVC, phương thức controller có thể khai báo tham số kiểu Model (org.springframework.ui.Model) rồi gọi addAttribute để đặt dữ liệu; sau khi phương thức trả về tên view, DispatcherServlet chuyển các thuộc tính này cho template, nên Thymeleaf đọc được chúng bằng biểu thức như ${products}. Model vì thế là đối tượng giữ dữ liệu đi từ controller sang view. "Entity" là lớp gắn @Entity ánh xạ tới bảng trong cơ sở dữ liệu; một entity có thể được đặt vào Model như một thuộc tính, nhưng bản thân nó là dữ liệu nghiệp vụ chứ không phải nơi chứa dữ liệu cho view. "View" là thành phần hiển thị, nó đọc dữ liệu từ model chứ không giữ dữ liệu. "Context" gợi tới ApplicationContext, tức container IoC quản lý bean, không phải chỗ truyền dữ liệu của một yêu cầu tới giao diện.
Mở trang câu hỏi này →
AXML
BJSON
CHTML
DCSV
Lời giải
Đáp án đúng: "JSON". Trong REST hiện đại và đặc biệt với Spring, khi controller @RestController trả về đối tượng Java, Spring MVC dùng HttpMessageConverter để chuyển đối tượng thành thân phản hồi, và Spring Boot cấu hình sẵn Jackson nên định dạng mặc định là JSON (JavaScript Object Notation), gọn, dễ đọc, trình duyệt và ứng dụng di động phân tích nhanh. "XML" vẫn dùng được nếu thêm thư viện jackson-dataformat-xml và client gửi Accept là application/xml, nhưng đó là lựa chọn bổ sung, không phải mặc định. "HTML" là định dạng của trang web hiển thị cho người, thường do view như Thymeleaf sinh, không phải định dạng dữ liệu của API REST. "CSV" chỉ hợp cho xuất bảng dữ liệu phẳng, không biểu diễn được đối tượng lồng nhau và không được Spring dùng mặc định.
Mở trang câu hỏi này →
5You have a controller: @RestController4 lựa chọncó code
Đề bài
class TestController {
  @GetMapping("/hello")
  public String hello() { return "Hi"; }
}

What is the response of GET /hello request?

AHTML page
BJSON object {"hello":"Hi"}
CPlain text 'Hi'
DError 404
Lời giải
Đáp án đúng: "Plain text 'Hi'". @RestController là gộp của @Controller và @ResponseBody, nên giá trị trả về của hello() không bị coi là tên view mà được ghi thẳng vào thân phản hồi; vì kiểu trả về là String, Spring chọn StringHttpMessageConverter và gửi về đúng chuỗi Hi dạng văn bản thuần. "HTML page" chỉ xảy ra với @Controller thường, khi chuỗi trả về được ViewResolver hiểu là tên template cần render. "JSON object {"hello":"Hi"}" sai vì chỉ đối tượng như Map hay một lớp có trường hello mới được Jackson chuyển thành JSON có khoá, còn một String đơn lẻ được ghi ra nguyên văn, không tự gói vào khoá nào. "Error 404" sai vì @GetMapping("/hello") đã ánh xạ đúng đường dẫn và phương thức GET, nên yêu cầu tìm được handler.
Mở trang câu hỏi này →
AViewResolver
BController
CDispatcherServlet
DResourceLoader
Lời giải
Đáp án đúng: "ViewResolver". Khi phương thức controller trả về một chuỗi như home, đó chỉ là tên view logic; DispatcherServlet hỏi các ViewResolver đã đăng ký để đổi tên này thành một đối tượng View thật, ví dụ ThymeleafViewResolver ghép tiền tố classpath:/templates/ và hậu tố .html để tìm tệp templates/home.html, còn InternalResourceViewResolver ghép đường dẫn tới tệp JSP. "Controller" chỉ tạo ra tên view và dữ liệu model, không biết template nằm ở đâu. "DispatcherServlet" điều phối toàn bộ luồng và là bên gọi ViewResolver, nhưng việc phân giải tên được uỷ cho ViewResolver chứ nó không tự làm. "ResourceLoader" là giao diện chung để nạp tài nguyên như tệp trên classpath hay hệ thống tệp theo đường dẫn, không có khái niệm tên view.
Mở trang câu hỏi này →
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 →
AController
BModel
CView
DDAO
Lời giải
Đáp án đúng: "View". Trong mô hình MVC, View là thành phần lấy dữ liệu đã chuẩn bị sẵn và dựng thành giao diện người dùng; ở Spring MVC đó là template Thymeleaf, trang JSP hay bất kỳ cài đặt nào của giao diện View, được ViewResolver chọn ra rồi render với dữ liệu trong model để sinh HTML trả về trình duyệt. "Controller" nhận yêu cầu, gọi logic nghiệp vụ và quyết định view nào sẽ hiển thị, nhưng không tự vẽ giao diện. "Model" chỉ là nơi chứa dữ liệu chuyển sang view, không có khả năng hiển thị. "DAO" (Data Access Object, đối tượng truy cập dữ liệu) nằm ở tầng dưới cùng, đọc ghi cơ sở dữ liệu, hoàn toàn tách khỏi giao diện.
Mở trang câu hỏi này →
AA database connection.
BA model and view.
CA user interface.
DA security token.
Lời giải
Đáp án đúng: "A model and view.". Trong Spring MVC, sau khi phương thức controller xử lý xong, nó trả cho DispatcherServlet thông tin để dựng phản hồi: hoặc một đối tượng ModelAndView chứa dữ liệu và tên view, hoặc một String tên view kèm dữ liệu đã đặt vào Model; DispatcherServlet sau đó nhờ ViewResolver tìm view và dựng HTML từ model. Với @RestController thì đối tượng trả về được chuyển thẳng thành JSON, nhưng với controller dựng trang truyền thống thì model kèm view là kết quả điển hình. "A database connection." sai vì kết nối cơ sở dữ liệu do DataSource và tầng repository quản lý, controller không trao nó ra ngoài. "A user interface." sai vì controller không tự dựng giao diện; view mới là thứ hiển thị, controller chỉ chỉ ra view nào. "A security token." sai vì token bảo mật do Spring Security hoặc tầng xác thực phát hành, không phải kết quả thông thường của một controller.
Mở trang câu hỏi này →
ATo handle user input.
BTo display data to the user.
CTo manage the application's data and business logic.
DTo route requests to the appropriate handlers.
Lời giải
Đáp án đúng: "To manage the application's data and business logic.". Trong mẫu MVC (Model-View-Controller), Model là phần nắm dữ liệu và quy tắc nghiệp vụ của ứng dụng, độc lập với cách hiển thị; trong Spring MVC, phần này gồm các thực thể, service và repository, còn đối tượng Model truyền sang view chỉ là chỗ đựng dữ liệu mà controller đã chuẩn bị. "To handle user input." là vai trò của Controller, nơi nhận yêu cầu, đọc tham số rồi gọi Model. "To display data to the user." là vai trò của View, như template Thymeleaf hoặc trang JSP, chỉ trình bày dữ liệu nhận được. "To route requests to the appropriate handlers." là việc của bộ điều phối như DispatcherServlet cùng HandlerMapping trong Spring MVC, thuộc khung xử lý chứ không phải Model.
Mở trang câu hỏi này →
11Which 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 →
AOnly for handling exceptions.
BOnly for mapping requests.
CFor cross cutting concerns like logging, authentication, and authorization.
DOnly for defining views.
Lời giải
Đáp án đúng: "For cross cutting concerns like logging, authentication, and authorization.". Interceptor trong Spring MVC là lớp hiện thực HandlerInterceptor, được DispatcherServlet gọi quanh việc xử lý của handler: preHandle trước controller, postHandle sau controller nhưng trước khi render view, và afterCompletion khi yêu cầu xong; nhờ vậy nó hợp cho các mối quan tâm cắt ngang (cross-cutting concerns) áp cho nhiều controller như ghi log, kiểm tra đăng nhập, phân quyền, đo thời gian. "Only for handling exceptions." sai vì xử lý ngoại lệ có @ExceptionHandler và @ControllerAdvice, interceptor chỉ được báo ngoại lệ trong afterCompletion. "Only for mapping requests." sai vì việc ánh xạ yêu cầu tới controller do HandlerMapping làm, interceptor chỉ được gắn vào kết quả ánh xạ đó. "Only for defining views." sai vì view do controller trả về và ViewResolver phân giải; postHandle có thể chỉnh ModelAndView nhưng đó không phải mục đích duy nhất, chữ Only làm phát biểu sai.
Mở trang câu hỏi này →
AController
BHandlerMapping
CDispatcherServlet
DViewResolver
Lời giải
Đáp án đúng: "DispatcherServlet". Spring MVC theo mẫu front controller (bộ điều khiển đứng trước): DispatcherServlet được đăng ký là servlet nhận mọi yêu cầu khớp mẫu URL của ứng dụng, rồi điều phối phần còn lại của vòng đời. "HandlerMapping" chỉ được DispatcherServlet hỏi sau khi yêu cầu đã tới, để tìm handler phù hợp với URL và phương thức HTTP. "Controller" chỉ được gọi gián tiếp qua HandlerAdapter khi handler đã được xác định, nên nhận yêu cầu ở khâu giữa chứ không phải đầu tiên. "ViewResolver" đứng gần cuối chuỗi, đổi tên view logic do controller trả về thành view thực tế để dựng phản hồi. Các Filter của Servlet container, như bộ lọc của Spring Security, có thể chạm yêu cầu trước DispatcherServlet, nhưng trong các thành phần của Spring MVC thì DispatcherServlet là cửa vào đầu tiên.
Mở trang câu hỏi này →
AHandlerMapping
BHandlerAdapter
CViewResolver
DModelAndView
Lời giải
Đáp án đúng: "HandlerMapping". Trong luồng xử lý của Spring MVC, DispatcherServlet nhận mọi yêu cầu rồi hỏi các HandlerMapping, ví dụ RequestMappingHandlerMapping đọc @RequestMapping và @GetMapping, để tìm phương thức controller khớp với URL và phương thức HTTP; kết quả là một handler cùng chuỗi interceptor. "HandlerAdapter" đứng ở bước sau: khi đã biết handler nào, adapter mới thực sự gọi nó, lo phần gắn tham số và xử lý giá trị trả về, chứ không phải nơi tìm handler. "ViewResolver" làm việc ở cuối luồng, đổi tên view logic như home thành một View cụ thể như template Thymeleaf. "ModelAndView" chỉ là đối tượng chứa dữ liệu model và tên view mà handler trả về, không ánh xạ yêu cầu nào.
Mở trang câu hỏi này →
A@RestController
B@Service
C@Entity
D@Bean
Lời giải
Đáp án đúng: "@RestController". @RestController là annotation tổng hợp gồm @Controller và @ResponseBody: lớp vẫn là handler web được Spring MVC quét, nhưng giá trị trả về của mọi phương thức được ghi thẳng vào thân phản hồi HTTP thông qua HttpMessageConverter, thường chuyển đối tượng Java thành JSON bằng Jackson, thay vì bị hiểu là tên view. Đây là cách viết REST API chuẩn trong Spring. "@Service" đánh dấu bean tầng nghiệp vụ, không nhận yêu cầu HTTP. "@Entity" là annotation JPA đánh dấu lớp ánh xạ tới bảng cơ sở dữ liệu. "@Bean" đặt trên phương thức trong lớp @Configuration để khai báo rằng đối tượng trả về được đăng ký làm bean, không liên quan tới việc xử lý yêu cầu REST.
Mở trang câu hỏi này →
ADispatcherServlet → HandlerMapping → HandlerAdapter → Controller → ViewResolver
BViewResolver → Controller → DispatcherServlet
CController → View → Model → DispatcherServlet
DHandler → Controller → DispatcherServlet
Lời giải
Đáp án đúng: "DispatcherServlet → HandlerMapping → HandlerAdapter → Controller → ViewResolver". Yêu cầu tới DispatcherServlet trước tiên; DispatcherServlet hỏi HandlerMapping để tìm handler khớp URL, rồi nhờ HandlerAdapter (thường là RequestMappingHandlerAdapter) gọi phương thức controller với các tham số đã gắn; controller trả tên view và model, DispatcherServlet đưa tên view cho ViewResolver để lấy đối tượng View rồi dựng phản hồi. "ViewResolver → Controller → DispatcherServlet" đảo ngược hoàn toàn: ViewResolver chỉ có việc khi controller đã trả về tên view, không thể đứng đầu. "Controller → View → Model → DispatcherServlet" sai vì controller không nhận yêu cầu trực tiếp, model được chuẩn bị trước khi dựng view, và DispatcherServlet là điểm vào chứ không phải điểm cuối. "Handler → Controller → DispatcherServlet" sai vì bỏ qua HandlerMapping, HandlerAdapter, ViewResolver và lại đặt DispatcherServlet ở cuối, trong khi handler chính là controller được tìm thấy sau khi DispatcherServlet nhận yêu cầu.
Mở trang câu hỏi này →
Aapplication.properties
Bdispatcher-servlet.xml
Cweb.xml
Dconfig.xml
Lời giải
Đáp án đúng: "web.xml". Trong ứng dụng Spring MVC kiểu truyền thống triển khai dạng war, DispatcherServlet được khai báo và ánh xạ trong tệp mô tả triển khai WEB-INF/web.xml bằng thẻ servlet và servlet-mapping, kèm init-param contextConfigLocation trỏ tới tệp cấu hình bean. "dispatcher-servlet.xml" là điểm dễ gây tranh cãi vì tên nó gợi tới DispatcherServlet, nhưng đó là tệp chứa định nghĩa bean cho ngữ cảnh web riêng của servlet như controller và ViewResolver, theo quy ước tên servlet cộng -servlet.xml, chứ không phải nơi khai báo servlet; servlet phải có trong web.xml thì tệp này mới được nạp. "application.properties" là tệp cấu hình của Spring Boot, mà Spring Boot tự đăng ký DispatcherServlet nên không cần cả web.xml lẫn dispatcher-servlet.xml. "config.xml" không phải tên tệp chuẩn nào của Spring MVC.
Mở trang câu hỏi này →
Đề bài
public String sayHello() {
    return "Hello, Spring!";
}
AA view named "Hello, Spring!"
BA JSON response
CA plain text response: Hello, Spring!
DAn HTML file from the templates directory
Lời giải
Đáp án đúng: "A plain text response: Hello, Spring!". Lần theo mã: @GetMapping với đường dẫn /hello ánh xạ yêu cầu GET /hello vào phương thức sayHello, và @ResponseBody báo Spring MVC ghi giá trị trả về thẳng vào thân phản hồi thay vì coi nó là tên view; giá trị kiểu String được StringHttpMessageConverter ghi nguyên văn, nên trình duyệt hiện đúng chuỗi Hello, Spring! dưới dạng văn bản. "A view named "Hello, Spring!"" chỉ xảy ra khi bỏ @ResponseBody, lúc đó chuỗi trả về mới được ViewResolver hiểu là tên view. "A JSON response" sai vì với kiểu String, converter chuỗi được ưu tiên trước Jackson nên chuỗi không bị bọc thành JSON. "An HTML file from the templates directory" sai vì không có view nào được phân giải, thư mục templates chỉ được dùng khi trả về tên view mà không có @ResponseBody.
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 →
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 →