Tất cả câu hỏi

Ngân hàng câu hỏi trắc nghiệm có giải thích chi tiết.

540/11.885 câuCòn 11.345
Avar
Bitems
Cstep
Dcase
Lời giải
Đáp án đúng: "case". Thẻ lặp của JSTL nhận "items" để chỉ tập nguồn, "var" để đặt tên biến phần tử, varStatus để lấy thông tin lượt chạy, cùng begin, end và "step" khi lặp theo chỉ số, nên ba thuộc tính kia đều hợp lệ và hay dùng. Thư viện này không có thuộc tính nào tên case, mà cũng không có thẻ cùng tên: việc rẽ nhiều nhánh được viết bằng c:choose bọc các c:when và một c:otherwise, nên từ khoá quen thuộc trong câu lệnh switch của Java không chuyển sang thư viện thẻ. Đáng chú ý là đặt một thuộc tính lạ vào thẻ JSTL không bị bỏ qua im lặng: ở pha dịch trang, container đối chiếu thẻ với khai báo trong bản mô tả thư viện thẻ, thấy thuộc tính không được khai báo thì báo lỗi dịch và trang không chạy.
Mở trang câu hỏi này →
AIt is automatically rolled back
BIt continues with the next statement
CIt is committed regardless of the error
DIt waits for user intervention
Lời giải
Đáp án đúng: "It is automatically rolled back". Giao dịch mang tính nguyên tử: gặp lỗi thì mọi thay đổi chưa commit bị trả về trạng thái trước đó, dù do mã bắt ngoại lệ rồi gọi rollback, hay do kết nối bị đóng và hết thời gian chờ khiến giao dịch đang mở bị huỷ. Vì vậy một chuỗi lệnh ghi trong web phải đặt setAutoCommit(false), commit ở cuối và rollback trong khối catch. Lựa chọn "It continues with the next statement" mô tả cảnh mỗi lệnh tự commit riêng, lúc đó không còn giao dịch chung để nói tới. Lựa chọn "It is committed regardless of the error" phá tính nguyên tử: lưu lại phần đã làm sẽ để dữ liệu nửa vời, ví dụ trừ tiền mà chưa cộng. Lựa chọn "It waits for user intervention" không có trong cơ chế này: không ai giữ giao dịch treo chờ người dùng quyết định, giữ lâu chỉ khoá dữ liệu rồi cuối cùng vẫn bị huỷ.
Mở trang câu hỏi này →
AThe container may not detect the change if you don't re-set the attribute.
BYou must always remove the session attribute before updating its contents.
CSession attributes must be immutable.
DUpdates are always automatically replicated.
Lời giải
Đáp án đúng: "The container may not detect the change if you don't re-set the attribute.". Khi lưu một đối tượng khả biến vào phiên rồi sửa trực tiếp trường bên trong nó, container không nhận được tín hiệu nào: nó chỉ biết có thay đổi tại lời gọi setAttribute, và chính lời gọi đó mới kích hoạt bộ lắng nghe thuộc tính cùng cơ chế nhân bản phiên giữa các node trong cụm. Vì thế quy ước an toàn là sửa xong thì đặt lại thuộc tính với cùng khoá. Lựa chọn "You must always remove the session attribute before updating its contents." dựng ra một bước bắt buộc không có thật: gọi setAttribute đè lên là đủ, xoá rồi thêm lại chỉ thêm khoảng trống dễ sinh lỗi. Lựa chọn "Session attributes must be immutable." quá mạnh: yêu cầu thực tế chỉ là đối tượng khả tuần tự hoá khi phiên cần ghi ra ngoài, chứ không cấm đối tượng khả biến. Lựa chọn "Updates are always automatically replicated." nói ngược chính cái bẫy, vì việc nhân bản không tự xảy ra sau một thay đổi tại chỗ.
Mở trang câu hỏi này →
A<c:forEach var="row" items="${dataList}"><c:if test="${row.status eq 'active'}">${row.name}</c:if></c:forEach>
B<c:forEach var="row" items="${dataList}"><c:if test="${row.status.equals("active")}">${row.name}</c:if></c:forEach>
C<c:forEach var="row" items="${dataList}"><c:when test="${row.status == 'active'}">${row.name}</c:when></c:forEach>
D<c:forEach var="dataList" items="${row}"><c:if test="${row.status == 'active'}">${row.name}</c:if></c:forEach>
Lời giải

Đáp án đúng: "<c:forEach

Lời giải
var="row" items="${dataList}"><c:if test="${row.status eq 'active'}">${
  row.name
}

</c:if></c:forEach>". Thuộc tính items nhận tập nguồn còn var đặt tên cho biến phần tử, nên items phải trỏ tới danh sách trong phạm vi request và var là biến từng dòng; trong thân vòng lặp mỗi phần tử là một Map nên biểu thức row.status được EL dịch thành phép tra khoá. Toán tử eq so sánh giá trị chuỗi và chịu được giá trị rỗng, còn thẻ điều kiện c:if đứng một mình hợp lệ. Lựa chọn chứa "<c:

Lời giải
if test="${row.status.equals("active")}">"

vỡ ngay ở pha dịch vì dấu nháy kép lồng vào một giá trị thuộc tính đã mở bằng nháy kép, bộ phân tích đóng thuộc tính sớm. Lựa chọn chứa "<c:when test="${row.status == 'active'}">" đặt thẻ sai chỗ: c:when chỉ hợp lệ khi nằm trực tiếp trong c:choose, đứng lẻ trong vòng lặp sẽ lỗi. Lựa chọn chứa "<c:forEach

Lời giải
var="dataList" items="${row}">"

đảo vai hai thuộc tính, thành ra lặp trên một biến chưa tồn tại và đặt tên biến phần tử trùng tên danh sách, nên không duyệt được gì.

Mở trang câu hỏi này →
AFilters are processed in a random order, not resembling any data structure.
BFilters are added to a stack-like structure as the request proceeds.
CFilters form a queue where the first filter in is the first one out.
DFilters operate in the alphabetical order of the filters name.
Lời giải
Đáp án đúng: "Filters are added to a stack-like structure as the request proceeds.". Chuỗi filter chạy lồng nhau: mỗi filter làm phần việc của nó rồi gọi chain.doFilter để đi tiếp, và phần mã viết sau lời gọi đó chỉ chạy khi lượt gọi bên trong đã quay về. Các lời gọi lồng nhau xếp trên ngăn xếp lời gọi nên filter vào trước lại hoàn tất sau cùng, đúng kiểu vào trước ra sau. Lựa chọn "Filters form a queue where the first filter in is the first one out." chỉ đúng nửa đi vào theo thứ tự khai báo, nhưng pha quay về đảo chiều nên không phải vào trước ra trước. Lựa chọn "Filters are processed in a random order, not resembling any data structure." sai vì thứ tự hoàn toàn xác định, do thứ tự các phần ghép filter trong bản mô tả triển khai quyết định. Lựa chọn "Filters operate in the alphabetical order of the filters name." nhầm vai của tên filter: tên chỉ dùng để tham chiếu khi ghép đường dẫn, container không sắp xếp theo bảng chữ cái.
Mở trang câu hỏi này →
AApache Tomcat
BNginx
COracle WebLogic Server
DMicrosoft IIS Server
Lời giải
Đáp án đúng: "Oracle WebLogic Server". Câu hỏi đòi đủ ba việc trong cùng một thành phần: chạy servlet và JSP, cấp kết nối cơ sở dữ liệu theo lối dùng chung qua pool, và quản lý giao dịch bằng JTA. Chỉ máy chủ ứng dụng Java EE đầy đủ mới gộp cả ba, và Oracle WebLogic Server thuộc loại đó. Lựa chọn "Apache Tomcat" là web container: nó chạy servlet, JSP và cấp được pool kết nối qua tài nguyên JNDI, nhưng không kèm trình quản lý giao dịch JTA, nên thiếu đúng phần được hỏi. Lựa chọn "Nginx" là web server và proxy ngược, phục vụ tệp tĩnh rồi chuyển tiếp lượt gọi, nó không dịch cũng không thực thi JSP. Lựa chọn "Microsoft IIS Server" là web server của Windows, gắn với hệ sinh thái ASP.NET và không chạy servlet Java.
Mở trang câu hỏi này →
A/WEB-INF/classes/
B/WEB-INF/lib/
C/META-INF/
D/WEB-INF/config/
Lời giải
Đáp án đúng: "/WEB-INF/lib/". Theo cấu trúc chuẩn của ứng dụng web Java, class loader riêng của ứng dụng tự nạp mọi tệp jar nằm trong /WEB-INF/lib/, nên chỉ cần đặt thư viện vào đó là dùng được, không phải khai báo thêm đường dẫn lớp nào. Lựa chọn "/WEB-INF/classes/" là nơi chứa các lớp đã biên dịch của chính ứng dụng, ở dạng cây thư mục theo gói với từng tệp class rời, chứ không phải nơi đặt jar. Lựa chọn "/META-INF/" giữ siêu dữ liệu đóng gói như MANIFEST và ở một số container là tệp khai báo ngữ cảnh; nội dung trong đó không được class loader của ứng dụng coi là thư viện. Lựa chọn "/WEB-INF/config/" không phải thư mục do đặc tả quy định; bạn tự tạo được để chứa tệp cấu hình, nhưng jar bỏ vào đó sẽ không ai nạp.
Mở trang câu hỏi này →
Adestroy()
Bstop()
Cend()
Ddispose()
Lời giải
Đáp án đúng: "destroy()". Vòng đời servlet do container điều khiển gồm ba mốc: init() một lần khi nạp, service() cho mỗi request, và destroy() một lần duy nhất trước khi thực thể bị loại khỏi dịch vụ, thường lúc ứng dụng bị tháo hoặc server tắt. Container gọi destroy() sau khi các luồng đang chạy trong service() kết thúc, nên đây là chỗ để đóng kết nối cơ sở dữ liệu, dừng luồng nền, ghi nhật ký kết thúc. Lựa chọn "stop()" không thuộc giao diện Servlet; tên này quen từ applet và từ việc dừng luồng, container không bao giờ gọi nó. Lựa chọn "end()" cũng không có trong hợp đồng vòng đời, viết một phương thức tên như vậy thì nó chỉ là phương thức thường và không được gọi tự động. Lựa chọn "dispose()" là quy ước giải phóng tài nguyên của các thư viện giao diện đồ hoạ, không nằm trong API servlet.
Mở trang câu hỏi này →
AWhen a user submits a form
BWhen a new session is created
CWhen the servlet context is initialized
DWhen a session is invalidated
Lời giải
Đáp án đúng: "When a new session is created". HttpSessionListener là bộ lắng nghe vòng đời của phiên: container gọi sessionCreated ngay sau khi nó cấp một HttpSession mới, tức ở lần đầu mã nguồn gọi request.getSession() mà chưa có phiên nào gắn với trình duyệt này, và gọi sessionDestroyed ở đầu kia của vòng đời. Lựa chọn "When a user submits a form" nhầm sự kiện: gửi biểu mẫu chỉ là một request HTTP thường, nó chỉ kéo theo việc sinh phiên nếu đó là lượt gọi đầu tiên cần tới phiên, còn bản thân hành vi gửi không phải sự kiện phiên. Lựa chọn "When the servlet context is initialized" thuộc bộ lắng nghe khác: thời điểm nạp ứng dụng được báo qua contextInitialized của ServletContextListener, xảy ra một lần cho cả ứng dụng và trước mọi phiên. Lựa chọn "When a session is invalidated" mô tả đúng thời điểm của sessionDestroyed, tức lúc phiên bị huỷ hoặc hết hiệu lực, không phải lúc phiên sinh ra.
Mở trang câu hỏi này →
AThey simplify the code and reduce redundancy
BThey improve security by encapsulating sensitive data
CThey enhance performance by reducing memory usage
DThey enable parallel processing of requests
Lời giải
Đáp án đúng: "They simplify the code and reduce redundancy". Khi container dịch trang thành servlet, nó khai báo sẵn trong phương thức phục vụ một loạt biến trỏ tới các đối tượng thông dụng như yêu cầu, phản hồi, phiên, phạm vi ứng dụng, luồng xuất và ngữ cảnh trang; nhờ vậy trang dùng được ngay mà không phải tự lấy tham chiếu hay lặp lại mấy dòng khởi tạo ở mọi trang. "They improve security by encapsulating sensitive data" sai vì chúng không bọc kín gì cả, trái lại chúng mở sẵn đường tới dữ liệu phiên và dữ liệu toàn ứng dụng, an toàn vẫn do người viết mã bảo đảm. "They enhance performance by reducing memory usage" sai vì đó vẫn là những đối tượng container phải tạo cho mỗi yêu cầu hoặc mỗi ứng dụng, đặt sẵn tên cho chúng không làm giảm bộ nhớ. "They enable parallel processing of requests" sai vì xử lý song song là nhờ container cấp một luồng cho mỗi yêu cầu, không liên quan tới việc có sẵn tên biến trong trang.
Mở trang câu hỏi này →
ALoginServlet
BHomeServlet
CMainServlet
DErrorHandler
Lời giải
Đáp án đúng: "LoginServlet". Container định tuyến bằng bộ mô tả triển khai: mỗi khối ánh xạ nối một mẫu URL với một tên servlet, và tên đó lại trỏ tới lớp khai báo ở khối servlet tương ứng. Với đường dẫn /login, quy tắc khớp chính xác được xét trước khớp theo tiền tố, trước khớp theo phần mở rộng và trước servlet mặc định, nên servlet được khai báo cho mẫu /login chính là thứ được gọi. "HomeServlet" sai vì nó chỉ chạy khi yêu cầu khớp mẫu URL khai báo cho riêng nó, mà /login không phải mẫu đó. "MainServlet" sai vì kể cả khi nó nhận một mẫu bao trùm theo tiền tố thì khớp chính xác vẫn thắng, container không chọn nó cho đường dẫn này. "ErrorHandler" sai vì thành phần loại đó được gọi qua khai báo trang lỗi khi có mã lỗi hoặc ngoại lệ, nó không nằm trên đường đi bình thường của một yêu cầu.
Mở trang câu hỏi này →
AA JSP is an entirely separate technology with no connection to Servlets.
BA JSP is a simplified type of Servlet, specifically designed for handling client-side and server-side logic.
CA JSP is ultimately translated into a Servlet before it can be executed by a web container.
DA JSP acts as a controller that delegates requests to various Servlets for processing.
Lời giải
Đáp án đúng: "A JSP is ultimately translated into a Servlet before it can be executed by a web container.". Lần đầu một trang được yêu cầu, container dịch tệp trang thành mã nguồn của một lớp servlet: phần HTML tĩnh trở thành các lệnh ghi ra luồng xuất, còn khối mã và biểu thức trở thành câu lệnh Java trong phương thức phục vụ; lớp đó được biên dịch, nạp rồi chạy, và các lần sau dùng lại bản đã biên dịch nếu tệp nguồn không đổi. Mệnh đề coi trang là "an entirely separate technology with no connection" sai vì nó phủ nhận chính quá trình dịch vừa nêu. Mệnh đề gọi trang là "a simplified type of Servlet, specifically designed" nghe gần đúng ở nửa đầu nhưng sai ở phần gán cho trang việc xử lý logic phía client, trong khi mọi mã trong trang đều chạy ở phía server. Mệnh đề nói trang "acts as a controller that delegates requests" sai vì đảo vai trong MVC: servlet làm điều khiển, trang lo hiển thị.
Mở trang câu hỏi này →
AChecks if the collection is null
BChecks if the collection is not empty
CChecks if the collection is empty
DRetrieves the size of the collection
Lời giải
Đáp án đúng: "Checks if the collection is empty". Toán tử này cho ra true khi đối tượng không có phần tử nào, và cũng cho true với null, chuỗi rỗng, mảng rỗng hay Map rỗng, nên trang JSP viết được điều kiện hiển thị dòng thông báo không có dữ liệu mà không phải gọi tới phương thức đếm. "Checks if the collection is null" là mô tả thiếu: xét null chỉ là một trường hợp mà toán tử này bao trọn, còn một danh sách khác null nhưng không chứa phần tử nào thì nó vẫn cho ra true. "Checks if the collection is not empty" sai vì ngược dấu; muốn hỏi khác rỗng thì phải thêm phép phủ định trước biểu thức. "Retrieves the size of the collection" sai vì kết quả trả về chỉ là giá trị đúng hoặc sai, không phải số lượng; muốn số lượng phải dùng hàm đếm của thư viện thẻ.
Mở trang câu hỏi này →
Arequest.setAttribute("RESULT",result); response.sendRedirect("SearchPage.jsp");
Brequest.setParameter("RESULT",result); request.getRequestDispatcher("SearchPage.jsp").forward(request,response);
Cresponse.getWriter().println("RESULT"); response.sendRedirect("SearchPage.jsp");
Drequest.setAttribute("RESULT",result); request.getRequestDispatcher("SearchPage.jsp").forward(request,response);
Lời giải

Đáp án đúng: "

Lời giải
request.setAttribute("RESULT",result);
request.getRequestDispatcher("SearchPage.jsp").forward(request,response);

". Muốn trang hiển thị được dữ liệu thì phải đặt kết quả vào phạm vi yêu cầu rồi chuyển tiếp: forward giao quyền xử lý ngay bên trong server và mang theo chính đối tượng yêu cầu đó, nên thuộc tính vừa đặt vẫn còn và trang JSP đọc được bằng biểu thức; địa chỉ trên trình duyệt không đổi và chỉ có một chuyến đi về. Lựa chọn "

Lời giải
request.setAttribute("RESULT",result);
response.sendRedirect("SearchPage.jsp");

" sai vì chuyển hướng buộc trình duyệt gửi một yêu cầu mới, yêu cầu cũ bị bỏ cùng mọi thuộc tính nên trang nhận được sẽ không thấy kết quả. Lựa chọn dùng "request.setParameter("RESULT",result)" sai vì yêu cầu không có phương thức đặt tham số: tham số là dữ liệu client gửi lên, mã server chỉ đọc. Lựa chọn dùng "response.getWriter().println("RESULT")" sai vì nó chỉ in ra một chuỗi rồi lại chuyển hướng, vừa không truyền được danh sách sản phẩm vừa ghi dở phản hồi trước khi chuyển.

Mở trang câu hỏi này →
AHosts the website’s static content
BProcesses client requests and returns dynamic content
CManages database connections
DAuthenticates user sessions
Lời giải
Đáp án đúng: "Processes client requests and returns dynamic content". Web server nhận yêu cầu HTTP, tra xem thành phần nào phụ trách đường dẫn đó, chuyển cho nó xử lý rồi gói kết quả thành phản hồi gửi về trình duyệt; trong Java web thì chính container gọi servlet hoặc trang JSP, và nội dung sinh ra thay đổi theo tham số, theo phiên và theo dữ liệu, nên đó là nội dung động. "Hosts the website’s static content" tuy không sai hẳn, vì server cũng phát tệp tĩnh, nhưng đó chỉ là một phần việc nhỏ và không phải vai trò mà câu hỏi nhắm tới; nếu chỉ cần phát tệp tĩnh thì không cần tới một server có container. "Manages database connections" sai vì việc giữ và cấp phát kết nối thuộc tầng dữ liệu của ứng dụng, thường qua một nguồn dữ liệu được cấu hình sẵn. "Authenticates user sessions" sai vì xác thực là một chức năng cụ thể do servlet hay filter của ứng dụng cài đặt, không phải vai trò chung của web server.
Mở trang câu hỏi này →
A<c:forEach>
B<c:iterate>
C<c:loop>
D<c:repeat>
Lời giải
Đáp án đúng: "<c:forEach>". Thẻ này nhận một tập hợp, mảng, Map hay chuỗi có dấu phân cách qua thuộc tính items, mỗi vòng gán phần tử hiện tại vào biến khai báo ở var để biểu thức trong thân in ra; nó cũng chạy được kiểu đếm số với begin, end và step, và varStatus cho biết chỉ số cùng vị trí vòng lặp để kẻ bảng xen màu. "<c:iterate>" sai vì thư viện lõi không định nghĩa thẻ nào tên iterate, tên này hay bị lẫn sang vòng lặp của thư viện thẻ khác. "<c:loop>" sai vì lõi cũng không có thẻ loop, việc lặp theo số lần vẫn do thẻ đúng ở trên đảm nhiệm với begin và end. "<c:repeat>" sai vì không có thẻ repeat trong lõi; khai báo tiền tố cho thư viện lõi rồi gọi tên này thì bộ dịch tra trong tệp mô tả thư viện không thấy thẻ và trang không dịch được.
Mở trang câu hỏi này →
AThe order in which the filters are defined in the web.xml file.
BThe filter's priority attribute.
CThe order in which the filters were added to the web application.
DThe servlet's URL pattern.
Lời giải
Đáp án đúng: "The order in which the filters are defined in the web.xml file.". Với các filter khớp theo mẫu URL, container nối chúng vào chuỗi theo đúng trình tự các khối ánh xạ xuất hiện trong bộ mô tả triển khai: đổi chỗ hai khối khai báo là đổi thứ tự chạy, nên bộ lọc đặt bảng mã phải khai báo trước bộ lọc đọc tham số nếu muốn chữ có dấu không bị lỗi. Đây cũng là lý do người ta vẫn khai báo trong tệp mô tả khi cần ấn định trật tự. "The filter's priority attribute." sai vì khai báo filter không có thuộc tính nào tên priority. "The order in which the filters were added to the web application." sai vì thời điểm lớp filter được thêm vào mã nguồn hay vào gói không ảnh hưởng gì tới trật tự chạy. "The servlet's URL pattern." sai vì mẫu URL chỉ quyết định filter nào được chọn vào chuỗi cho yêu cầu đó, không quyết định ai chạy trước ai.
Mở trang câu hỏi này →
A.zip
B.jar
C.war
D.ear
Lời giải
Đáp án đúng: ".war". Đây là định dạng đóng gói chuẩn của một ứng dụng web Java: bên trong có thư mục WEB-INF chứa lớp servlet đã biên dịch, thư viện phụ thuộc và bộ mô tả triển khai, cùng các trang JSP và tài nguyên tĩnh ở ngoài; thả tệp này vào thư mục triển khai của container là nó tự giải nén rồi nạp ứng dụng với một context path. ".zip" sai vì nó chỉ là tệp nén thuần, không mang cấu trúc mà container nhận biết, nên server không coi đó là một ứng dụng để triển khai. ".jar" sai vì đó là gói thư viện hoặc ứng dụng Java thường, thiếu phần mô tả web; trong ứng dụng web nó nằm trong thư mục thư viện chứ không phải vật đóng gói cả ứng dụng. ".ear" sai vì đó là gói cấp doanh nghiệp dùng để bao nhiều module cho máy chủ Java đầy đủ, và phần web bên trong nó vẫn là một gói web như trên.
Mở trang câu hỏi này →
AThe filter matching the request via a URL pattern.
BThe filter matching the request via a servlet name.
CThe filter declared first in the deployment descriptor.
DThe filter processed in alphabetical order based on its name.
Lời giải
Đáp án đúng: "The filter matching the request via a URL pattern.". Khi dựng chuỗi filter cho một yêu cầu, container xếp trước toàn bộ filter khớp theo mẫu URL, theo đúng thứ tự khai báo trong bộ mô tả triển khai, rồi mới nối tiếp các filter khớp theo tên servlet; vì vậy với một yêu cầu khớp cả hai kiểu, filter khớp mẫu URL luôn chạy trước. "The filter matching the request via a servlet name." sai vì nó vẫn được vào chuỗi nhưng đứng sau nhóm khớp mẫu URL, nên nó không phải thứ chạy trước. "The filter declared first in the deployment descriptor." sai vì thứ tự khai báo chỉ quyết định trật tự bên trong từng nhóm, nó không vượt được quy tắc nhóm khớp mẫu URL đứng trước nhóm khớp tên servlet. "The filter processed in alphabetical order based on its name." sai vì đặc tả không hề xếp chuỗi theo thứ tự chữ cái; tên filter chỉ dùng để nối khối khai báo với khối ánh xạ.
Mở trang câu hỏi này →
AAt the end of the filter's lifecycle
BBefore each doFilter() method call
CAfter the web application is undeployed
DImmediately after the filter's first invocation
Lời giải
Đáp án đúng: "At the end of the filter's lifecycle". Container gọi init đúng một lần khi đưa đối tượng filter vào hoạt động, gọi doFilter cho từng yêu cầu khớp mẫu, rồi gọi destroy đúng một lần ở cuối đời đối tượng đó, sau khi mọi lời gọi doFilter đang dở đã kết thúc, để filter trả lại những tài nguyên nó giữ như kết nối hay tệp log. "Before each doFilter() method call" sai vì không có móc nào chạy trước từng lần lọc; chính phần đầu của doFilter đóng vai đó. "After the web application is undeployed" sai vì thứ tự ngược lại: container phải gọi destroy trong lúc còn đang dỡ ứng dụng, tức trước khi ứng dụng rời khỏi bộ nhớ, chứ không thể gọi vào một đối tượng đã bị bỏ. "Immediately after the filter's first invocation" sai vì chỉ có một đối tượng filter dùng lại cho mọi yêu cầu, hết lần lọc đầu tiên nó vẫn phải sống để phục vụ tiếp.
Mở trang câu hỏi này →