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

Câu hỏi: PRJ301 Phát triển ứng dụng Java web – Bộ ôn tập thi lại số 2

47 câu trắc nghiệm kèm lời giải của môn PRJ301 - Phát triển ứng dụng Java web, xếp đúng thứ tự trong đề. Trang 2/3 — câu 21–40.

Danh sách câu hỏi

40/47 câuCòn 7
A${requestScope.book.getId()}, ${requestScope.book.getName()}
B<%= request.getAttribute("book")%>
C<jsp:getProperty name="book" property="id"/>, <jsp:getProperty name="book" property="name"/>
D${requestScope.book.id}, ${requestScope.book.name}
E${applicationScope.book.id}, ${applicationScope.book.name}
Lời giải

Đáp án đúng gồm hai ý: "${

Lời giải
requestScope.book.getId()
}
, ${
  requestScope.book.getName()
}

" và "${requestScope.book.id}, ${requestScope.book.name}". Cả hai đều là EL và đều tra đúng phạm vi request: dạng rút gọn dùng quy ước JavaBeans nên EL tự tìm phương thức đọc tương ứng với tên thuộc tính, còn dạng có cặp ngoặc gọi thẳng phương thức đọc, cách EL hiện nay cho phép. Lựa chọn "<%= request.getAttribute("book")%>" không phải EL mà là biểu thức script, và nó in kết quả chuyển chuỗi của cả đối tượng chứ không lấy riêng mã và tên sách. Lựa chọn chứa "<jsp:getProperty name="book" property="id"/>" là thẻ hành động, đòi một bean đã khai báo bằng thẻ useBean với cùng tên, nên cũng không đáp ứng yêu cầu dùng EL của câu hỏi. Lựa chọn "${applicationScope.book.id}, ${applicationScope.book.name}" tra sai phạm vi: thuộc tính được đặt trong request không có trong phạm vi ứng dụng, biểu thức cho giá trị rỗng và trang in ra chỗ trống.

Mở trang câu hỏi này →
ASet-Cookie
BCookie-Set
CCookie
DSet-Cookie-Header
Lời giải
Đáp án đúng: "Set-Cookie". Khi servlet gọi response.addCookie, container chuyển cookie thành một dòng tiêu đề Set-Cookie trong phần đầu của phản hồi, mỗi cookie một dòng, kèm các thuộc tính như đường dẫn, thời gian sống, cờ chỉ dùng cho HTTP; trình duyệt đọc tiêu đề đó rồi lưu lại. Vì tiêu đề nằm ở phần đầu phản hồi, cookie chỉ thêm được trước khi nội dung bắt đầu gửi đi. Lựa chọn "Cookie" là tiêu đề của chiều ngược lại: trình duyệt dùng nó để gửi các cookie đã lưu lên máy chủ trong những lượt gọi sau, phía servlet đọc qua request.getCookies. Lựa chọn "Cookie-Set" chỉ đảo trật tự hai từ, không có tiêu đề nào tên như vậy. Lựa chọn "Set-Cookie-Header" ghép thêm một từ vào tên thật; tên tiêu đề phải khớp từng ký tự nên dạng này không trình duyệt nào hiểu.
Mở trang câu hỏi này →
AThe bean still exists and can be accessed
BThe bean will be destroyed when the request ends
CA runtime error occurs
DThe bean will be saved to the session automatically
Lời giải
Đáp án đúng: "The bean will be destroyed when the request ends". Phạm vi request chỉ sống trong một chu kỳ phục vụ: đối tượng được giữ làm thuộc tính của HttpServletRequest, hết lượt thì tham chiếu mất và bộ thu gom rác lấy lại bộ nhớ. Một trang JSP khác chỉ thấy bean đó nếu nó nằm trong cùng lượt gọi, tức khi điều hướng bằng forward; còn khi trình duyệt phát request mới, chẳng hạn sau sendRedirect hay khi gõ lại địa chỉ, dữ liệu cũ không còn. Lựa chọn "The bean still exists and can be accessed" nhầm phạm vi request với phiên hoặc ứng dụng. Lựa chọn "A runtime error occurs" không đúng với cách EL xử lý dữ liệu thiếu: tra khoá không có sẽ cho giá trị rỗng và in ra chuỗi trống, trang vẫn chạy, đó mới là chỗ khó phát hiện. Lựa chọn "The bean will be saved to the session automatically" gán cho container việc nó không làm: muốn dữ liệu sống qua nhiều lượt gọi thì phải tự đặt vào phiên.
Mở trang câu hỏi này →
24What will a HTTP request contain?5 lựa chọn
AA request method
BA request URL
CHeader fields
DBody
EAll of the others
Lời giải
Đáp án đúng: "All of the others". Một thông điệp request HTTP gồm dòng yêu cầu mang phương thức và đường dẫn, rồi khối tiêu đề, rồi một dòng trống và phần thân nếu có, nên bốn thành phần được kể đều là bộ phận của cùng một thông điệp. Lựa chọn "A request method" chỉ nêu phần cho biết ý định của lượt gọi, như lấy dữ liệu hay gửi dữ liệu, thứ mà container dựa vào để chọn doGet hoặc doPost. Lựa chọn "A request URL" chỉ nêu địa chỉ tài nguyên, phần được so với các mẫu đường dẫn khi định tuyến. Lựa chọn "Header fields" chỉ nêu khối tiêu đề mang thông tin kèm theo như kiểu nội dung, cookie, ngôn ngữ ưa dùng. Lựa chọn "Body" chỉ nêu phần thân, chỗ chứa dữ liệu biểu mẫu hay tệp tải lên và thường rỗng ở lượt gọi chỉ để đọc. Từng lựa chọn đó đúng nhưng thiếu, nên câu bao trùm cả bốn mới trả lời được câu hỏi.
Mở trang câu hỏi này →
AIt defines the servlet's initialization parameters
BIt maps a servlet to a URL pattern
CIt sets the servlet's session timeout
DIt specifies the servlet's version
Lời giải
Đáp án đúng: "It maps a servlet to a URL pattern". Trong bản mô tả triển khai, phần khai báo servlet gắn một tên logic với lớp xử lý, còn phần ghép servlet-mapping nối chính tên logic đó với một hay nhiều mẫu đường dẫn; khi request tới, container so đường dẫn với các mẫu theo luật khớp của đặc tả rồi chuyển cho servlet tương ứng. Thiếu phần ghép này thì lớp servlet vẫn tồn tại nhưng không có địa chỉ nào gọi tới nó. Lựa chọn "It defines the servlet's initialization parameters" nói về init-param nằm bên trong khai báo servlet, đọc bằng getInitParameter và không liên quan tới định tuyến. Lựa chọn "It sets the servlet's session timeout" thuộc phần cấu hình phiên, khai báo một lần cho cả ứng dụng. Lựa chọn "It specifies the servlet's version" không có trong phần tử này; con số phiên bản chỉ nằm ở thuộc tính của thẻ gốc web-app, cho biết đặc tả mà bản mô tả tuân theo.
Mở trang câu hỏi này →
AHandling user requests
BInitializing objects for database connections
CCreating session objects
DConfiguring global application settings
Lời giải
Đáp án đúng: "Initializing objects for database connections". contextInitialized chạy một lần khi container nạp ứng dụng, trước khi bất kỳ servlet nào phục vụ lượt gọi nào, và nhận sự kiện có kèm ServletContext nên đặt được tài nguyên dùng chung vào đó. Vì vậy nó là chỗ hợp lý để dựng nguồn kết nối hoặc pool, nạp driver, mở sẵn những đối tượng tốn kém rồi lưu làm thuộc tính của ngữ cảnh và đóng lại trong contextDestroyed. Lựa chọn "Handling user requests" sai mốc thời gian vì xử lý lượt gọi là việc của service, doGet, doPost. Lựa chọn "Creating session objects" không khả thi: phiên chỉ sinh ra khi một người dùng cụ thể gửi request, mà lúc nạp ứng dụng chưa có ai. Lựa chọn "Configuring global application settings" là việc khai báo, thường đặt sẵn bằng context-param và đọc ra khi cần, nên nó là yếu tố cấu hình chứ không phải tác vụ khởi tạo mà phương thức này tồn tại để làm.
Mở trang câu hỏi này →
APreparedStatement prevents SQL injection attacks
BPreparedStatement provides better performance
CPreparedStatement allows for dynamic SQL generation
DPreparedStatement returns a more detailed error message
Lời giải
Đáp án đúng: "PreparedStatement prevents SQL injection attacks". Câu lệnh được gửi tới cơ sở dữ liệu ở dạng có dấu giữ chỗ, sau đó từng giá trị được truyền vào bằng các phương thức đặt tham số kèm kiểu, không ghép vào chuỗi SQL. Cấu trúc câu lệnh đã cố định trước khi biết dữ liệu, nên một chuỗi nhập chứa dấu nháy hay từ khoá SQL cũng chỉ được coi là dữ liệu. Lựa chọn "PreparedStatement provides better performance" nêu lợi ích thật nhưng thứ cấp: nhờ câu lệnh được phân tích trước, lặp nhiều lần sẽ nhanh hơn, song đó không phải mục đích chính câu hỏi nhắm tới. Lựa chọn "PreparedStatement allows for dynamic SQL generation" nói ngược: dấu giữ chỗ chỉ thay được giá trị, không thay được tên bảng hay cả mệnh đề. Lựa chọn "PreparedStatement returns a more detailed error message" không phải khác biệt giữa hai giao diện, vì thông báo lỗi do driver sinh ra như nhau.
Mở trang câu hỏi này →
Ainit(), service(), destroy()
Binitialize(), service(), destroy()
Cinit(), execute(), destroy()
Dinit(), service(), delete()
Lời giải
Đáp án đúng: "init(), service(), destroy()". Container nạp lớp servlet, tạo một thực thể, gọi init() đúng một lần để chuẩn bị, sau đó với mỗi lượt gọi lại gọi service() trên cùng thực thể đó, và khi tháo ứng dụng thì gọi destroy() một lần rồi bỏ thực thể. Ba tên này là hợp đồng trong giao diện Servlet nên container chỉ biết gọi đúng chúng. Lựa chọn "initialize(), service(), destroy()" sai tên mốc đầu: đặt tên như vậy thì phần chuẩn bị của bạn không bao giờ chạy, vì container vẫn gọi init của lớp cha. Lựa chọn "init(), execute(), destroy()" sai mốc phục vụ; execute là tên quen ở các khung hành động, còn ở servlet thì service mới là nơi phân nhánh theo phương thức HTTP sang doGet hay doPost. Lựa chọn "init(), service(), delete()" sai mốc kết thúc, khiến phần giải phóng tài nguyên không được gọi khi ứng dụng dừng.
Mở trang câu hỏi này →
AModel
BView
CController
DData Access
Lời giải
Đáp án đúng: "Model". Kiến trúc MVC2 đặt một servlet làm cửa vào duy nhất: servlet gọi tầng nghiệp vụ và dữ liệu, đặt kết quả vào phạm vi request rồi chuyển cho trang JSP chỉ để hiển thị. Nhờ vậy phần mang dữ liệu và quy tắc nghiệp vụ được tách khỏi phần trình bày, trang JSP không còn chứa mã truy cập cơ sở dữ liệu nên giao diện gọn và dễ sửa. Lựa chọn "View" chính là phần trình bày mà câu đang nói tới, điền vào đây thành ra tách trình bày khỏi trình bày. Lựa chọn "Controller" là phần điều phối: nó nhận lượt gọi, chọn việc cần làm và chọn trang trả về, vai trò nằm giữa chứ không phải cái được tách ra khỏi hiển thị. Lựa chọn "Data Access" là một tầng kỹ thuật hay dựng thêm bên dưới, nhưng nó không phải một trong ba vai được kiến trúc này đặt tên, và việc tách nó là hệ quả của việc tách phần dữ liệu nghiệp vụ nói chung.
Mở trang câu hỏi này →
AThe Servlet creates a new instance for each request
BThe Servlet runs on multiple threads within the same instance
CThe Servlet processes each request sequentially
DA new thread is created for each request and each thread has its own instance of the Servlet
Lời giải
Đáp án đúng: "The Servlet runs on multiple threads within the same instance". Container tạo đúng một thực thể cho mỗi khai báo servlet, rồi với mỗi lượt gọi lấy một luồng từ pool và gọi service trên cùng thực thể đó, nên nhiều request chạy song song bên trong một đối tượng. Hệ quả thực hành: biến cục bộ trong phương thức là an toàn vì mỗi luồng có bản riêng, còn trường của lớp servlet bị chia sẻ nên không được dùng để giữ trạng thái của một người dùng. Lựa chọn "The Servlet creates a new instance for each request" nhầm cách container tiết kiệm tài nguyên, vì thực thể chỉ sinh ra lúc nạp. Lựa chọn "The Servlet processes each request sequentially" mô tả kiểu xếp hàng từng lượt, điều chỉ xảy ra nếu mã tự khoá lại, và nó làm mất khả năng phục vụ đồng thời. Lựa chọn chứa "each thread has its own instance of the Servlet" đúng ở chỗ mỗi lượt gọi có một luồng nhưng sai ở chỗ gán cho mỗi luồng một thực thể riêng.
Mở trang câu hỏi này →
AThe session is paused, but data remains
BThe session is completely destroyed, and all attributes are unbound
CThe session data is backed up for later restoration
DAll sessions on the server are invalidated and the users are logged out
Lời giải
Đáp án đúng: "The session is completely destroyed, and all attributes are unbound". Lời gọi này huỷ phiên hiện tại: container tháo mọi thuộc tính khỏi phiên và phát sự kiện tương ứng cho các bộ lắng nghe, rồi bỏ phiên khỏi bảng quản lý. Sau đó getSession(false) trả về rỗng, còn mã nào giữ tham chiếu cũ mà dùng lại sẽ gặp lỗi trạng thái; đây chính là cách đăng xuất đúng, thường kèm việc xoá cookie định danh phiên. Lựa chọn "The session is paused, but data remains" dựng ra một trạng thái tạm dừng không có trong cơ chế phiên. Lựa chọn "The session data is backed up for later restoration" nhầm với việc container ghi phiên ra ngoài khi khởi động lại ứng dụng, vốn là chuyện khác và không áp dụng cho phiên đã huỷ. Lựa chọn chứa "All sessions on the server are invalidated" mở rộng phạm vi quá xa, vì phương thức chỉ tác động lên đúng phiên mà nó được gọi trên, người dùng khác không bị ảnh hưởng.
Mở trang câu hỏi này →
32Which is true about JDBC?4 lựa chọn
AThe JDBC API is an extension of the ODBC API
BAll JDBC drivers are pure Java.
CJDBC is used to connect to MOM (Message-Oriented Middleware Product)
DThe JDBC API is included in J2SE
Lời giải
Đáp án đúng: "The JDBC API is included in J2SE". Các gói java.sql và javax.sql là thành phần của thư viện chuẩn Java bản nền, nên chỉ cần máy ảo Java là đã có Connection, Statement, ResultSet và DataSource; thứ phải thêm vào là driver của hệ quản trị cụ thể. Lựa chọn "The JDBC API is an extension of the ODBC API" nhầm quan hệ giữa hai bên: JDBC là API Java độc lập, chỉ vay cách tổ chức từ ODBC, còn cầu nối giữa chúng là một loại driver chứ không phải sự mở rộng. Lựa chọn "All JDBC drivers are pure Java." quá rộng: có những driver gọi xuống thư viện gốc của hệ quản trị hoặc đi qua cầu ODBC, chúng cần phần mềm cài kèm trên máy nên không thuần Java. Lựa chọn "JDBC is used to connect to MOM (Message-Oriented Middleware Product)" sai miền ứng dụng: trao đổi thông điệp qua hàng đợi là việc của API nhắn tin, còn JDBC nói chuyện với cơ sở dữ liệu quan hệ bằng SQL.
Mở trang câu hỏi này →
AOnly during the initialization of the servlet
BDuring the entire lifecycle of the servlet container
COnly during the processing of a specific HTTP request
DOnly during the destruction of the servlet
Lời giải
Đáp án đúng: "During the entire lifecycle of the servlet container". Thuộc tính đặt bằng setAttribute của ServletContext nằm trong đối tượng ngữ cảnh dùng chung: nó có từ lúc ứng dụng được nạp, mọi servlet, filter và trang JSP trong cùng ứng dụng đọc được, và chỉ mất khi ứng dụng bị tháo hoặc container dừng. Vì vòng đời dài như vậy, đây là chỗ giữ tài nguyên dùng chung, nhưng cũng là chỗ phải tự bảo đảm an toàn luồng. Lựa chọn "Only during the initialization of the servlet" nhầm với tham số khởi tạo đọc trong init, thứ chỉ có nghĩa với một servlet. Lựa chọn "Only during the processing of a specific HTTP request" mô tả phạm vi request, nơi dữ liệu mất ngay khi lượt phục vụ kết thúc. Lựa chọn "Only during the destruction of the servlet" đảo ngược vòng đời, vì tới lúc servlet bị tháo thì thuộc tính ngữ cảnh đã dùng được từ lâu.
Mở trang câu hỏi này →
ACompilation phase
BTranslation phase
CExecution phase
DInitialization phase
Lời giải
Đáp án đúng: "Translation phase". Ở pha dịch, container đọc tệp JSP, gặp chỉ thị taglib thì tìm bản mô tả thư viện thẻ, đối chiếu từng thẻ tuỳ biến với khai báo trong đó, kiểm tên thẻ và các thuộc tính, rồi sinh mã Java gọi lớp xử lý thẻ tương ứng. Chính ở bước này một thẻ tuỳ biến mới được nhận ra là thẻ: thiếu chỉ thị taglib thì nó bị in nguyên ra trang như văn bản thường. Lựa chọn "Compilation phase" chỉ biên dịch đoạn mã Java vừa sinh thành lớp, lúc đó thẻ đã thành lời gọi phương thức. Lựa chọn "Execution phase" là lúc chạy lớp đã dịch để tạo nội dung trả về, nó thi hành bộ xử lý thẻ chứ không còn phân giải thẻ nữa. Lựa chọn "Initialization phase" ứng với lời gọi khởi tạo trên trang đã thành servlet, xảy ra một lần và không dính tới việc phân giải thẻ.
Mở trang câu hỏi này →
ATo define the structure of the webpage
BTo specify the background color of the webpage
CTo contain the visible content of the webpage
DTo include external JavaScript files
Lời giải
Đáp án đúng: "To contain the visible content of the webpage". Tài liệu HTML chia hai vùng: phần đầu giữ siêu dữ liệu không hiển thị như tiêu đề cửa sổ, bộ ký tự, liên kết tới tệp định dạng; phần thân giữ những gì trình duyệt vẽ ra cho người xem như đoạn văn, bảng, biểu mẫu, ảnh. Mọi thứ JSP sinh ra để người dùng đọc đều nằm trong vùng này. Lựa chọn "To define the structure of the webpage" nói quá rộng: cấu trúc tổng thể do chính tài liệu và các thẻ ngữ nghĩa bên trong quyết định, còn thẻ đang hỏi chỉ là một trong hai vùng. Lựa chọn "To specify the background color of the webpage" nhắc một thuộc tính trình bày kiểu cũ nay đã nhường cho CSS, và màu nền dù đặt được cũng chỉ là chi tiết, không phải mục đích của thẻ. Lựa chọn "To include external JavaScript files" là việc của thẻ script với thuộc tính nguồn, thẻ đó đặt được ở nhiều chỗ chứ không gắn riêng với vùng nội dung.
Mở trang câu hỏi này →
AConfiguring servlets and filters
BWriting Java business logic
CDefining custom tags
DConfiguring connection between web-app and database
Lời giải
Đáp án đúng: "Configuring servlets and filters". Tệp này là bản mô tả triển khai: container đọc nó khi nạp ứng dụng để biết servlet nào ứng với mẫu đường dẫn nào, chuỗi filter nào chắn trước những đường dẫn nào, bộ lắng nghe nào cần tạo, trang lỗi và trang chào ra sao. Nội dung của nó là khai báo cấu hình, không phải chỗ chứa hành vi. Lựa chọn "Writing Java business logic" sai bản chất tệp: đây là XML, còn logic nghiệp vụ nằm trong các lớp Java mà tệp này trỏ tới. Lựa chọn "Defining custom tags" thuộc bản mô tả thư viện thẻ, nơi khai báo tên thẻ, lớp xử lý và thuộc tính; bản mô tả triển khai nhiều nhất chỉ chỉ ra chỗ đặt thư viện. Lựa chọn "Configuring connection between web-app and database" mô tả việc thường khai báo trong cấu hình tài nguyên của container rồi tra qua JNDI, còn tệp này chỉ tham chiếu tới tài nguyên đó chứ không tự mở kết nối.
Mở trang câu hỏi này →
ATo modify the header content before sending it to the client
BTo intercept and manipulate requests and responses
CTo authenticate users before accessing public resources
DTo handle database operations
Lời giải
Đáp án đúng: "To intercept and manipulate requests and responses". Filter đứng giữa container và tài nguyên đích: trong phương thức xử lý, nó xem và sửa được lượt gọi trước khi chuyển đi tiếp theo chuỗi, xem và sửa được phản hồi trên đường về, hoặc chặn hẳn không cho đi tiếp. Nhờ chỗ đứng đó, cùng một filter dùng cho nhiều đường dẫn để làm những việc cắt ngang như đặt bộ ký tự, nén, ghi nhật ký, kiểm tra đăng nhập. Lựa chọn "To modify the header content before sending it to the client" chỉ kể một trường hợp dùng cụ thể, hẹp hơn nhiều so với khả năng của filter. Lựa chọn "To authenticate users before accessing public resources" lệch ở chữ công khai, vì tài nguyên công khai thì không cần xác thực, filter kiểu bảo vệ được ghép trước các đường dẫn hạn chế. Lựa chọn "To handle database operations" đặt sai tầng: truy cập dữ liệu là việc của lớp nghiệp vụ và lớp truy xuất.
Mở trang câu hỏi này →
AThey are used to declare variables
BThey execute Java code and return a value to be displayed in the client's response
CThey can include method definitions
DThey are executed only once per page load
Lời giải
Đáp án đúng: "They execute Java code and return a value to be displayed in the client's response". Biểu thức trong JSP được pha dịch chuyển thành một lệnh ghi ra luồng xuất của trang, nên phần bên trong phải là một biểu thức có giá trị và không kết thúc bằng dấu chấm phẩy; giá trị đó được đổi sang chuỗi rồi ghép vào nội dung trả về cho trình duyệt. Lựa chọn "They are used to declare variables" là việc của khối khai báo, phần sinh ra trường và phương thức của lớp servlet tương ứng với trang. Lựa chọn "They can include method definitions" cũng thuộc khối khai báo; đặt một định nghĩa phương thức vào chỗ chờ giá trị thì trang không dịch được. Lựa chọn "They are executed only once per page load" nhầm với phần chỉ chạy một lần như lời gọi khởi tạo trang; biểu thức chạy lại mỗi lượt gọi, và nếu nằm trong vòng lặp thì chạy mỗi vòng.
Mở trang câu hỏi này →
ATo store and retrieve session data
BTo define the structure of a database table
CTo manage a pool of database connections
DTo execute SQL queries
Lời giải
Đáp án đúng: "To manage a pool of database connections". DataSource là lớp trừu tượng thay cho việc tự gọi DriverManager: ứng dụng tra đối tượng này qua JNDI rồi xin một kết nối, còn phía sau container giữ sẵn một tập kết nối đang mở, cho vay khi cần và nhận lại khi kết nối được đóng. Nhờ vậy mỗi lượt gọi không phải trả giá mở kết nối mới, và thông tin máy chủ cùng tài khoản nằm trong cấu hình chứ không rải trong mã. Lựa chọn "To store and retrieve session data" là việc của phiên và các thuộc tính trong đó, không dính tới tầng kết nối. Lựa chọn "To define the structure of a database table" thuộc các lệnh định nghĩa dữ liệu phía cơ sở dữ liệu, không phải của một đối tượng cấp kết nối. Lựa chọn "To execute SQL queries" chỉ sai đối tượng: câu lệnh chạy bằng Statement hoặc PreparedStatement lấy từ một Connection, mà Connection mới là thứ DataSource trả về.
Mở trang câu hỏi này →
AThe model processes the request
BThe controller receives the request and processes it
CThe view updates the data
DThe database returns the result
Lời giải
Đáp án đúng: "The controller receives the request and processes it". Trong MVC hướng web, mọi lượt gọi đi vào bộ điều khiển trước: servlet đã ghép với mẫu đường dẫn nhận request, đọc tham số, kiểm tính hợp lệ, rồi quyết định nghiệp vụ nào cần gọi. Chỉ sau đó tầng mô hình mới làm việc, và cuối cùng bộ điều khiển chọn trang để hiển thị kết quả. Lựa chọn "The model processes the request" đảo thứ tự: tầng mô hình không mở cửa ra ngoài, nó chỉ được gọi khi bộ điều khiển chuyển dữ liệu đã lọc vào. Lựa chọn "The view updates the data" sai cả thứ tự lẫn vai, vì phần hiển thị chỉ đọc dữ liệu đã dọn sẵn để vẽ ra chứ không sửa dữ liệu. Lựa chọn "The database returns the result" là mắt gần cuối của chuỗi truy xuất, nằm sau khi tầng mô hình đã gửi câu lệnh xuống, nên không thể là bước đầu tiên.
Mở trang câu hỏi này →