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ố 4

50 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/50 câuCòn 10
Arequest
Bsession
Capplication
Dresponse
Lời giải
Đáp án đúng: "application". Đối tượng ẩn application tương ứng với ServletContext, mỗi ứng dụng web chỉ có một và nó sống từ lúc triển khai tới lúc dừng, nên thuộc tính đặt vào đây thì mọi servlet, mọi trang JSP và mọi người dùng đều đọc được; đó là chỗ cho bộ đếm chung, bộ nhớ đệm hay nguồn dữ liệu dùng lại. Lựa chọn "request" chỉ sống trong một lượt yêu cầu, hết lượt là mất, nên không giữ được dữ liệu ở mức ứng dụng. Lựa chọn "session" rộng hơn nhưng vẫn riêng cho từng người dùng, mỗi phiên một bản nên không dùng để chia sẻ chung. Lựa chọn "response" không phải vùng lưu dữ liệu, nó là đường ghi nội dung trả về gồm tiêu đề, mã trạng thái và luồng ra. Vì dữ liệu ở mức ứng dụng dùng chung, khi nhiều yêu cầu cùng ghi thì mã phải tự đồng bộ.
Mở trang câu hỏi này →
Aconnect()
BcreateConnection()
CgetConnection()
DopenConnection()
Lời giải
Đáp án đúng: "getConnection()". DriverManager là lớp tiện ích tĩnh của JDBC: khi gọi phương thức này với chuỗi URL, tên người dùng và mật khẩu, nó dò qua các trình điều khiển đã nạp, chọn trình điều khiển nhận ra URL rồi trả về một đối tượng Connection đang mở. Lựa chọn "connect()" đúng là tên có trong giao diện Driver ở tầng thấp hơn, nhưng mã ứng dụng không gọi trực tiếp vào đó và bản thân DriverManager không cung cấp phương thức này. Lựa chọn "createConnection()" là tên tự đặt, không thuộc java.sql nên mã sẽ không biên dịch được. Lựa chọn "openConnection()" gợi nhớ cách mở kết nối từ một java.net.URL, hoàn toàn không liên quan tới JDBC. Trong ứng dụng web, kết nối thường được lấy từ một DataSource có bể để không phải mở mới mỗi lần.
Mở trang câu hỏi này →
ABetter performance with repeated queries
BAvoid SQL Injection errors
CAutomatically commit transactions
DBoth A and B are correct
Lời giải
Đáp án đúng: "Both A and B are correct". Câu lệnh tham số hoá được gửi tới hệ quản trị dưới dạng khuôn có dấu hỏi làm chỗ trống, nên kế hoạch thực thi được chuẩn bị một lần rồi dùng lại cho nhiều lượt chạy; đồng thời giá trị truyền qua các phương thức đặt tham số được driver chuyển đi như dữ liệu chứ không ghép vào chuỗi SQL, nên kẻ tấn công không chèn thêm được mệnh đề nào. Hai lợi ích vì vậy cùng xuất hiện. "Better performance with repeated queries" đúng nhưng chỉ nêu một nửa, nó bỏ qua lợi ích an toàn, trong khi đó mới là lý do quan trọng nhất khiến người ta rời Statement. "Avoid SQL Injection errors" cũng chỉ nêu nửa còn lại và bỏ qua phần hiệu năng khi chạy lặp. "Automatically commit transactions" sai hẳn vì việc chốt giao dịch do đối tượng kết nối quyết định qua cờ tự commit cùng hai lệnh commit và rollback; loại câu lệnh dùng để chạy SQL không can thiệp vào đó.
Mở trang câu hỏi này →
AA pool of HTTP connections maintained by the web server
BA cache for storing session data
CA pool of pre-initialized database connections for reuse
DA collection of JavaScript functions for handling database operations
Lời giải
Đáp án đúng: "A pool of pre-initialized database connections for reuse". Mở một kết nối tới hệ quản trị là việc đắt vì phải bắt tay mạng rồi xác thực, nên ứng dụng tạo sẵn một tập kết nối và cho mượn: gọi getConnection() là nhận một kết nối rỗi, gọi close() là trả nó về bể chứ không đóng thật, nhờ đó độ trễ giảm và số kết nối đồng thời bị chặn trên. Lựa chọn "A pool of HTTP connections maintained by the web server" nói về kết nối giữa trình duyệt và máy chủ, thuộc tầng giao thức web chứ không phải kết nối cơ sở dữ liệu. Lựa chọn "A cache for storing session data" mô tả nơi giữ trạng thái người dùng, một việc khác hẳn với tái dùng kết nối. Lựa chọn nói đó là "A collection of JavaScript functions" dùng cho xử lý dữ liệu thì đặt sai cả ngôn ngữ lẫn phía chạy, vì truy cập cơ sở dữ liệu ở đây diễn ra trong máy chủ Java.
Mở trang câu hỏi này →
Aint result = statement.executeUpdate("SELECT * FROM table_name");
BResultSet resultSet = statement.execute("SELECT * FROM table_name");
CResultSet resultSet = statement.executeQuery("SELECT * FROM table_name");
Dboolean result = statement.execute("SELECT * FROM table_name");
Lời giải

Đáp án đúng: "ResultSet resultSet =

Lời giải
statement.executeQuery("SELECT *
FROM table_name");

". Với câu truy vấn trả về các dòng, executeQuery() là phương thức duy nhất cho thẳng một ResultSet, nên kiểu của biến bên trái khớp kiểu trả về và ngay sau đó duyệt được bằng vòng lặp next(). Lựa chọn viết "int result = statement.executeUpdate(" rồi đưa câu truy vấn vào là sai công dụng, bởi phương thức đó dành cho các câu làm biến đổi dữ liệu và chỉ trả về số nguyên đếm số dòng bị ảnh hưởng, không hề có tập kết quả. Lựa chọn viết "ResultSet resultSet = statement.execute(" gán sai kiểu, vì execute() trả về boolean chứ không trả ResultSet nên trình biên dịch từ chối ngay. Lựa chọn viết "boolean result = statement.execute(" thì đúng kiểu nhưng chỉ cho biết kết quả đầu tiên có phải tập dòng hay không, muốn lấy dữ liệu vẫn phải gọi tiếp getResultSet().

Mở trang câu hỏi này →
AExplicit transaction management by invoke con.beginTrans()
BTurn off auto commit mode from DBSM for implicit transaction
CIt is automatically managed by DBMS
DInvoke con.commit() or con,rollback()
Lời giải
Đáp án đúng: "Invoke con.commit() or con,rollback()". Trong JDBC, giao dịch được điều khiển trên chính đối tượng Connection: đặt setAutoCommit(false) để nhiều câu lệnh gộp vào một giao dịch, rồi kết thúc bằng commit() khi mọi việc trôi chảy hoặc rollback() trong khối bắt lỗi để trả dữ liệu về trạng thái trước đó; chính cặp lệnh kết thúc này là chỗ lập trình viên quyết định giao dịch, nên nó là câu trả lời sát nhất. "Explicit transaction management by invoke con.beginTrans()" sai vì Connection không có phương thức nào tên như vậy, giao dịch tường minh bắt đầu bằng việc tắt chế độ tự commit chứ không bằng một lệnh mở. "Turn off auto commit mode from DBSM for implicit transaction" sai chỗ: chế độ tự commit được tắt từ phía mã JDBC trên Connection, và tắt nó là bước mở đầu cho giao dịch tường minh chứ không tự kết thúc giao dịch. "It is automatically managed by DBMS" sai vì khi để nguyên chế độ tự commit thì mỗi câu lệnh là một giao dịch riêng, không có cách nào gộp nhiều câu lệnh lại.
Mở trang câu hỏi này →
ATo reduce the complexity of the application code.
BTo improve data security and scalability.
CTo facilitate easier debugging of the application.
DTo allow for a single layer to handle all tasks.
Lời giải
Đáp án đúng: "To improve data security and scalability.". Chia ứng dụng thành nhiều tầng đặt mỗi trách nhiệm vào một chỗ: tầng trình bày không nói trực tiếp với cơ sở dữ liệu, mọi truy cập đi qua tầng nghiệp vụ và tầng dữ liệu nên kiểm soát quyền cùng kiểm tra đầu vào làm tập trung được, đồng thời từng tầng triển khai riêng và nhân bản độc lập khi tải tăng. Lựa chọn "To reduce the complexity of the application code." đi ngược thực tế, vì thêm tầng là thêm giao diện, thêm đối tượng truyền dữ liệu và thêm mã nối; cái đạt được là tách bạch chứ không phải ít mã hơn. Lựa chọn "To facilitate easier debugging of the application." chỉ là lợi ích kéo theo khi ranh giới rõ ràng, không phải mục đích chính. Lựa chọn "To allow for a single layer to handle all tasks." mô tả đúng cái mà kiến trúc nhiều tầng muốn tránh.
Mở trang câu hỏi này →
28What is MVC architecture?4 lựa chọn
AMulti-View Controller
BModule-View-Controller
CModel-View-Controller
DModel-Value-Configuration
Lời giải
Đáp án đúng: "Model-View-Controller". Ba thành phần ứng với ba vai rõ rệt: Model giữ dữ liệu và luật nghiệp vụ, thường là lớp thực thể cùng lớp truy cập dữ liệu; View chỉ hiển thị, trong ứng dụng Java web là trang JSP dùng EL và thẻ JSTL; Controller là servlet nhận yêu cầu, gọi Model rồi chọn View để forward tới. Lựa chọn "Multi-View Controller" đọc nhịu phần đầu, nó ngụ ý nhiều khung hiển thị mà không nêu được vai giữ dữ liệu, thiếu Model thì không còn mẫu kiến trúc này. Lựa chọn "Module-View-Controller" thay Model bằng Module, một từ chỉ đơn vị tổ chức mã, không mang nghĩa tầng dữ liệu và nghiệp vụ. Lựa chọn "Model-Value-Configuration" giữ được Model nhưng mất cả View lẫn Controller, nên không còn chỗ hiển thị và không còn chỗ điều phối yêu cầu.
Mở trang câu hỏi này →
ADuplicate the data retrieval logic in each JSP page.
BImplement a shared DataProvider class in the Model.
CUse global variables within the JSP pages to store and share data.
DEmbed the data retrieval logic within each individual JSP page.
Lời giải
Đáp án đúng: "Implement a shared DataProvider class in the Model.". Khi nhiều trang cần cùng một bộ dữ liệu, cách đúng với MVC là đẩy phần lấy dữ liệu xuống Model thành một lớp dùng chung, rồi controller gọi lớp đó và đặt kết quả vào phạm vi request hoặc application cho các View đọc; sửa một nơi là mọi trang đổi theo, và cách trình bày nhất quán vì nguồn chỉ có một. Lựa chọn "Duplicate the data retrieval logic in each JSP page." chính là trùng lặp mã mà câu hỏi muốn tránh, đổi truy vấn phải sửa nhiều tệp và rất dễ lệch nhau. Lựa chọn "Use global variables within the JSP pages to store and share data." đặt trạng thái vào biến dùng chung của trang, vừa phá ranh giới tầng vừa không an toàn khi nhiều yêu cầu chạy song song trên cùng một đối tượng servlet. Lựa chọn "Embed the data retrieval logic within each individual JSP page." nhúng mã truy cập dữ liệu vào View, biến trang hiển thị thành nơi chứa nghiệp vụ và vẫn lặp ở từng trang.
Mở trang câu hỏi này →
AIt would make the application harder to test due to increased complexity
BIt would improve testability by allowing the components to be tested in isolation
CIt would have no impact on testability as the architecture doesn't influence testing approaches
DIt would reduce testability due to the tight coupling between view and controller.
Lời giải
Đáp án đúng: "It would improve testability by allowing the components to be tested in isolation". MVC2 dồn việc điều phối vào một servlet trung tâm và đẩy nghiệp vụ xuống các lớp Java thuần, nên mỗi phần kiểm thử được một mình: lớp mô hình và lớp truy cập dữ liệu chạy trong bộ kiểm thử đơn vị mà không cần container, bộ điều khiển thử bằng đối tượng yêu cầu và phản hồi giả lập, còn trang hiển thị chỉ còn việc đọc dữ liệu đã chuẩn bị sẵn nên gần như không còn logic phải kiểm. "It would make the application harder to test due to increased complexity" sai vì cái tăng thêm là số lớp, không phải độ rối của từng đơn vị; mỗi đơn vị nhỏ và ít phụ thuộc thì càng dễ kiểm. "It would have no impact on testability as the architecture doesn't influence testing approaches" sai vì kiến trúc quyết định đúng cái ranh giới kiểm thử: khi nghiệp vụ nằm lẫn trong trang hiển thị thì buộc phải chạy cả máy chủ mới thử nổi. "It would reduce testability due to the tight coupling between view and controller." sai ngay ở tiền đề, chính MVC2 làm giảm ràng buộc chặt giữa hiển thị và điều khiển bằng cách cho chúng chỉ trao đổi qua dữ liệu đặt trong phạm vi yêu cầu.
Mở trang câu hỏi này →
Đề bài
<a href="logoutServlet">Logout</a>

When the client clicks the logout link, the following code in the logoutServlet runs:

Đề bài
  HttpSession session = request.getSession();
//TODO
  response.sendRedirect("login.jsp");

What is the best code to write in the TODO section to complete the logout function?

Asession.removeAll();
Bsession.getAttribute(“USER”).remove();
Csession.removeAttribute(“USER”);
Dsession.invalidate();
Eif(session.getAtriibute(“USER”)!=null) session.remove(“USER”);
Fsession.remove();
Lời giải

Đáp án đúng: "session.invalidate(); ". Lời gọi này huỷ cả phiên phía máy chủ: mọi thuộc tính bị bỏ và mã định danh cũ không còn hiệu lực, nên sau khi chuyển hướng về trang đăng nhập thì các trang như trang hồ sơ hay trang lịch sử đơn không đọc lại được dữ liệu người dùng cũ, kể cả khi người dùng bấm nút lùi. Lời gọi "session.removeAll(); " không biên dịch được vì giao diện phiên không có phương thức tên đó. Lời gọi "session.getAttribute(“USER”).remove(); " sai hai lẽ: thứ trả về là một vật thể chung không có phương thức này, và khi chưa đăng nhập thì giá trị rỗng sẽ gây ngoại lệ con trỏ rỗng. Lời gọi "session.removeAttribute(“USER”); " chạy được nhưng chỉ bỏ một thuộc tính, phiên vẫn sống cùng các thuộc tính khác nên chưa phải đăng xuất dứt điểm. Dòng "

Lời giải
if(session.getAtriibute(“USER”)!=null) session.remove(“USER”);

" dùng hai tên hàm không có trong giao diện phiên, lại viết sai chính tả, nên không biên dịch được. Lời gọi "session.remove(); " cũng vậy, không tồn tại trong giao diện phiên.

Mở trang câu hỏi này →
AThe session will not work
BThe session will still work if the application uses URL rewriting to maintain the session ID
CThe application will crash as soon as the session is created
DThe session will still work but cannot save state between requests
Lời giải
Đáp án đúng: "The session will still work if the application uses URL rewriting to maintain the session ID". Phiên bên máy chủ chỉ cần định danh phiên đi theo mỗi yêu cầu; mặc định định danh đó nằm trong cookie, nhưng khi trình duyệt không nhận cookie thì ứng dụng có thể gắn nó vào chính địa chỉ bằng response.encodeURL(), container đọc lại từ đường dẫn rồi tìm đúng HttpSession cũ. Lựa chọn "The session will not work" bỏ qua con đường thứ hai này, phiên vẫn hoạt động miễn mọi liên kết đều được mã hoá lại. Lựa chọn "The application will crash as soon as the session is created" không có cơ sở, getSession() vẫn tạo được phiên bình thường, chỉ là lượt sau không nhận ra người dùng nếu định danh không được truyền. Lựa chọn "The session will still work but cannot save state between requests" tự phủ định mình, vì giữ trạng thái qua nhiều yêu cầu đúng là lý do tồn tại của phiên.
Mở trang câu hỏi này →
AString url = response.appendParameterToURL("sessionID", "123");
BString url = request.appendURLParameter("sessionID", "123");
Cresponse.sendRedirect("currentURL?sessionID=123");
DString url = response.encodeURL("currentURL?sessionID=123");
Lời giải

Đáp án đúng: "String url = response.encodeURL("currentURL?sessionID=123"); ". Gắn thêm thông tin phiên vào địa chỉ là nhiệm vụ của phản hồi: encodeURL() nhận địa chỉ gốc rồi trả về địa chỉ đã viết lại, container tự quyết định có cần thêm định danh phiên hay không, nên đây đúng là cách làm URL rewriting mà vẫn để container lo phần phiên. Lựa chọn "String url =

Lời giải
response.appendParameterToURL("sessionID", "123");

" gọi một phương thức không tồn tại trong HttpServletResponse nên mã không biên dịch được. Lựa chọn "String url = request.appendURLParameter("sessionID", "123"); " cũng là tên tự đặt và còn gọi trên đối tượng yêu cầu, nơi chỉ đọc được tham số chứ không sinh địa chỉ. Lựa chọn "

Lời giải
response.sendRedirect("currentURL?sessionID=123");

" không viết lại địa chỉ mà bắt trình duyệt đi tới trang khác, tức thực hiện chuyển hướng chứ không trả về chuỗi địa chỉ đã gắn tham số.

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 →
Đề bài
class: ${
  emp.tel
}

Which of the following statements accurately describes the requirements for accessing and displaying the tel field using this EL expression?

AThe tel field must be declared as public, and no getter method is required.
BThe tel field may be private, but a getTel() method must be provided.
CBoth A and B are correct.
DNeither A nor B is correct.
Lời giải
Đáp án đúng: "The tel field may be private, but a getTel() method must be provided.". EL không đọc trực tiếp trường của lớp: dấu chấm trong biểu thức được hiểu là truy cập thuộc tính theo quy ước JavaBeans, nên khi gặp cách viết trong đề, bộ xử lý đi tìm getTel() (hoặc isTel() nếu kiểu boolean) và báo lỗi không tìm thấy thuộc tính nếu lớp chỉ có trường mà không có phương thức đọc; mức truy cập của trường không hề được xét tới. "The tel field must be declared as public, and no getter method is required." sai đúng ở chỗ đó: để trường là public cũng không giúp EL nhìn thấy nó. "Both A and B are correct." sai vì nó kéo theo cả mệnh đề đòi trường public và bỏ getter, trong khi chỉ cần một phương thức đọc đặt tên đúng quy ước là đủ. "Neither A nor B is correct." sai vì mệnh đề cho phép trường private kèm getTel() mô tả chính xác cách EL lấy giá trị thuộc tính.
Mở trang câu hỏi này →
A${f.price}
B${f.getPrice()}
C${f.subTotal}
D${f.calcSubTotal()}
Lời giải

Đáp án đúng: "${

Lời giải
f.calcSubTotal()
}
".

Từ bản EL hỗ trợ gọi phương thức, cú pháp có cặp ngoặc đơn nghĩa là gọi thật một phương thức công khai của đối tượng, nên biểu thức này chạy thuật toán tính tổng phụ rồi in giá trị trả về; đó là cách duy nhất trong danh sách kích hoạt được phép tính. Lựa chọn "${f.price}" chỉ truy cập thuộc tính, EL gọi getPrice() và cho ra đơn giá, không có phép tính nào được thực hiện. Lựa chọn "${

Lời giải
f.getPrice()
}
"

gọi được phương thức nhưng vẫn là getter của price, kết quả vẫn là đơn giá chứ không phải tổng phụ. Lựa chọn "${f.subTotal}" khiến EL đi tìm thuộc tính tên subTotal, tức tìm getSubTotal(); lớp Food không có phương thức ấy nên trang báo lỗi không tìm thấy thuộc tính thay vì chạy phép tính.

Mở trang câu hỏi này →
ARetrieve the first element of the items array in the cart object from the session
BEL will return null if the cart does not exist in the session
CError because EL does not support array retrieval
DBoth A and B are correct
Lời giải
Đáp án đúng: "Both A and B are correct". EL đọc biểu thức trong đề theo từng chặng: tra tên cart trong phạm vi session, lấy tiếp thuộc tính items, rồi dùng toán tử ngoặc vuông để lấy phần tử ở chỉ số 0 của mảng hoặc danh sách đó. Nếu một chặng nào trả về null thì cả biểu thức cho ra null và trang in ra chuỗi rỗng chứ không ném ngoại lệ, vì vậy cả hai mệnh đề cùng mô tả đúng một phần hành vi. Mệnh đề nói biểu thức lấy "the first element of the items array in the cart object" đúng nhưng chỉ là một nửa câu trả lời, vì nó im lặng về trường hợp giỏ hàng chưa có trong phiên. Mệnh đề nói EL sẽ "return null if the cart does not exist" cũng đúng một nửa, vì nó không nói gì tới việc truy cập phần tử khi dữ liệu có đủ. "Error because EL does not support array retrieval" sai vì toán tử ngoặc vuông truy cập được cả mảng, danh sách, Map và thuộc tính của bean.
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 →
Đề bài
public class MyAppContextListener implements ServletContextListener {
    public void contextInitialized(ServletContextEvent event) {
        // TODO: Your code here
    }

    public void contextDestroyed(ServletContextEvent event) {
        // TODO: Your code here
    }
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 đúng một lần khi ngữ cảnh ứng dụng vừa dựng xong và chưa phục vụ yêu cầu nào, nên đây là chỗ dựng sẵn những tài nguyên nặng dùng chung cả đời ứng dụng rồi đặt vào ServletContext, điển hình là bể kết nối hoặc nguồn dữ liệu, để phần sau chỉ việc lấy ra dùng. Lựa chọn "Handling user requests" không thể xảy ra ở đây, lúc này chưa có yêu cầu nào và listener cũng không nhận được cặp request với response. Lựa chọn "Creating session objects" cũng không, phiên chỉ sinh ra khi một người dùng cụ thể gửi yêu cầu và mã gọi getSession(). Lựa chọn "Configuring global application settings" là việc thứ cấp: tham số toàn cục thường đã khai sẵn trong context-param và chỉ cần đọc ra, nên nó không phải loại công việc tiêu biểu của phương thức này.
Mở trang câu hỏi này →
AAfter the web server receives an HTTP request.
BWhen a new session is created for a client.
CWhen the web application is deployed or started.
DAfter the response is sent back to the client.
Lời giải
Đáp án đúng: "When the web application is deployed or started.". ServletContextListener theo dõi vòng đời của ngữ cảnh ứng dụng: container tạo ServletContext khi nạp ứng dụng, phát sự kiện rồi gọi contextInitialized() trước khi bất kỳ servlet nào phục vụ yêu cầu, và gọi contextDestroyed() lúc tháo ứng dụng. Lựa chọn "After the web server receives an HTTP request." nhầm sang mức yêu cầu, nơi tương ứng là ServletRequestListener hoặc chính phương thức service(). Lựa chọn "When a new session is created for a client." ứng với HttpSessionListener và xảy ra nhiều lần, riêng cho từng người dùng. Lựa chọn "After the response is sent back to the client." cũng thuộc mức yêu cầu và còn ở cuối một lượt xử lý, trong khi contextInitialized() chỉ chạy đúng một lần ở đầu đời ứng dụng.
Mở trang câu hỏi này →